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("https://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

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

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

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

执行输入清理

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

使用不同的库

如果使用的库或方法无法以安全的方式配置,则应考虑使用不同的库或方法。XML Pull ParserSAX 解析器 都可以以安全的方式配置,不允许使用 DTD 和实体。

资源