准则
安全配置错误 - 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