准则

安全配置错误 - XXE 详细

XML eXternal Entities"(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"。 

在 "doctype "定义之后,我们就有了实际的 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 路径的解析。或者仍然允许扩展实体,这本身就可能导致拒绝服务漏洞。 

.NET

如果您运行的是 .NET 4.5.1 或以下版本,默认情况下以下类会受到攻击:

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