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 Parser 和 SAX Parser 都可以以安全的方式进行配置,不允许使用 DTD 和实体。