XML 外部实体注入 (XXE)

OWASP 类别MASVS-CODE:代码质量

概览

XML 外部实体注入 (XXE) 是一种针对解析 XML 输入的应用的攻击。当配置较弱的 XML 解析器处理引用外部实体的不可信 XML 输入时,就会发生 XXE 攻击。此攻击可用于发起多起事件,包括拒绝服务攻击、文件系统访问或数据渗漏。

影响

当应用解析 XML 文档时,它可以处理文档中包含的任何 DTD(文档类型定义,也称为外部实体)。攻击者可以通过将恶意代码注入为 DTD 来利用此行为。然后,此代码可以访问设备文件系统的部分内容,这些内容只能由应用访问,并且可能包含敏感数据。 此外,此恶意代码可以从设备发出请求,从而可能绕过边界安全措施。

最后,如果应用展开 DTD,则可能会出现引用实体的多次迭代,从而耗尽设备资源并导致拒绝服务攻击。

缓解措施

停用 DTD

防止 XXE 的最安全方法是始终完全停用 DTD(外部实体)。根据所使用的解析器,该方法可能类似于 XML Pull Parser 库的以下示例:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

停用 DTD 还可以使解析器免受拒绝服务攻击。 如果无法完全停用 DTD,则必须以特定于每个解析器的方式停用外部实体和外部文档类型声明。

由于市场上有大量的 XML 解析引擎,因此防止 XXE 攻击的方法因引擎而异。您可能需要参阅引擎文档了解更多信息。

执行输入清理

应重新配置应用,使其不允许用户在 XML 文档的前言中注入任意代码。这必须在服务器端进行验证,因为客户端控件可以被绕过。

使用其他库

如果无法以安全的方式配置所使用的库或方法,则应考虑使用其他库或方法。XML Pull ParserSAX Parser 都可以以安全的方式进行配置,从而禁止 DTD 和实体。

资源