指南

安全配置错误 - XXE 详解

“XML 外部实体”(XXE)漏洞属于一种涉及 XML 解析器的安全配置错误。

XML 标准包含引用“实体”(如文件和 URL)的方法。解析器通常默认会完全解析外部实体,这意味着 XML 文档可能会导致文件及其他敏感信息泄露给潜在的攻击者。

简单示例

让我们来看一个使用外部实体的 XML 文档示例:

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

首先,我们声明一个新的“文档类型”(doctype),它定义了文档内可以存在并由解析器处理的结构/元素类型。

在其中,我们指定了一个名为“externalEntity”的 SYSTEM 类型实体。该实体指向“/etc/passwd”文件。

在“文档类型”定义之后,是实际的 XML 数据。我们定义了一个“outerElement”,然后添加了一个对“externalEntity”实体的引用(由“&”表示)。

此时,解释器将查找实体定义,解析所定义的 URL,并将其替换为“&externalEntity;”。

解析过程结束后,最终得到的文档如下所示:

xml
<?xml version="1.0" ?>
<outerElement>
    root:x:0:0:root:/root:/usr/bin/zsh
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ....
</outerElement>

缓解措施

防御 XXE 的具体需求和方法在很大程度上取决于所使用的语言、框架及其版本。

每种组合通常都允许禁用解析器的某些方面,这可能防止文件被解析,但无法阻止 HTTP 路径的解析。或者,它可能仍然允许实体扩展,这本身就可能导致拒绝服务(DoS)漏洞。

.NET

如果您使用的是 .NET 4.5.1 或更低版本,以下类默认存在漏洞:

  • XmlDocument(使用 ‘xmlDocument.XmlResolver = null;’ 禁用)
  • XmlTextReader(使用 ‘xmlTextReader.ProhibitDtd = true;’ 禁用)
  • XPathNavigator

‍

标语

实用安全编码

探索安全编码指南,了解并缓解 OWASP Top 10 等软件漏洞,并通过引导式训练任务在真实的应用程序模拟中进行实践。

更多指南
预约演示