指南
安全配置错误 - 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 等软件漏洞,并通过引导式训练任务在真实的应用程序模拟中进行实践。