Pikachu靶场-XXE
字数 886 2025-08-11 21:26:39

XXE (XML External Entity) 注入漏洞详解

1. XXE漏洞概述

XXE (XML External Entity Injection) 即"XML外部实体注入漏洞",是一种安全漏洞,攻击者通过向服务器注入指定的XML实体内容,使服务器按照恶意配置执行操作。

漏洞本质:当服务端接收和解析来自用户端的XML数据时,未做严格的安全控制,导致可以解析外部实体。

2. XML实体基础

XML实体是XML文档中的存储单元,可以包含:

  • 内部实体:在文档内部定义
  • 外部实体:引用外部资源

示例

<!DOCTYPE example [
  <!ENTITY internal "This is internal">
  <!ENTITY external SYSTEM "http://example.com/file.txt">
]>

3. 漏洞产生条件

  1. 应用程序解析XML输入
  2. XML解析器配置允许外部实体解析
  3. 未对用户输入的XML进行过滤

PHP示例

// 危险配置 - 允许外部实体解析
$doc = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);

4. 漏洞利用方式

4.1 读取本地文件

<?xml version="1.0"?>
<!DOCTYPE test [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

4.2 使用PHP包装器读取源码(Base64编码)

<?xml version="1.0"?>
<!DOCTYPE test [
  <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">
]>
<data>&xxe;</data>

4.3 其他攻击向量

  • 内网端口扫描
  • 服务器端请求伪造(SSRF)
  • 远程代码执行(在某些条件下)

5. 防御措施

5.1 禁用外部实体

PHP示例

libxml_disable_entity_loader(true);

5.2 使用安全的XML解析器配置

  • 禁用DTD处理
  • 禁用外部实体加载
  • 禁用外部参数实体

5.3 输入验证

  • 白名单验证XML结构
  • 过滤或替换危险关键词(如SYSTEM, ENTITY等)

5.4 其他措施

  • 使用JSON替代XML(如适用)
  • 保持XML解析器库更新
  • 最小化XML解析器的权限

6. 现代语言中的默认防护

许多现代语言和库已默认禁用外部实体解析:

  • PHP的libxml ≥ 2.9.0默认禁用
  • Java的JAXP 1.5+默认禁用
  • Python的lxml默认禁用

7. 测试与验证

测试XXE漏洞时:

  1. 尝试基本的XXE payload
  2. 检查错误响应差异
  3. 尝试带外(OOB)技术
  4. 测试不同协议(file, http, ftp等)

8. 实际案例分析

在Pikachu靶场中,通过以下步骤演示XXE:

  1. 提交合法XML验证解析功能
  2. 尝试内部实体
  3. 升级为外部实体读取系统文件
  4. 使用PHP包装器读取源码

关键点:观察服务器如何处理XML输入,特别是是否解析并返回了外部实体内容。

XXE (XML External Entity) 注入漏洞详解 1. XXE漏洞概述 XXE (XML External Entity Injection) 即"XML外部实体注入漏洞",是一种安全漏洞,攻击者通过向服务器注入指定的XML实体内容,使服务器按照恶意配置执行操作。 漏洞本质 :当服务端接收和解析来自用户端的XML数据时,未做严格的安全控制,导致可以解析外部实体。 2. XML实体基础 XML实体是XML文档中的存储单元,可以包含: 内部实体:在文档内部定义 外部实体:引用外部资源 示例 : 3. 漏洞产生条件 应用程序解析XML输入 XML解析器配置允许外部实体解析 未对用户输入的XML进行过滤 PHP示例 : 4. 漏洞利用方式 4.1 读取本地文件 4.2 使用PHP包装器读取源码(Base64编码) 4.3 其他攻击向量 内网端口扫描 服务器端请求伪造(SSRF) 远程代码执行(在某些条件下) 5. 防御措施 5.1 禁用外部实体 PHP示例 : 5.2 使用安全的XML解析器配置 禁用DTD处理 禁用外部实体加载 禁用外部参数实体 5.3 输入验证 白名单验证XML结构 过滤或替换危险关键词(如 SYSTEM , ENTITY 等) 5.4 其他措施 使用JSON替代XML(如适用) 保持XML解析器库更新 最小化XML解析器的权限 6. 现代语言中的默认防护 许多现代语言和库已默认禁用外部实体解析: PHP的libxml ≥ 2.9.0默认禁用 Java的JAXP 1.5+默认禁用 Python的lxml默认禁用 7. 测试与验证 测试XXE漏洞时: 尝试基本的XXE payload 检查错误响应差异 尝试带外(OOB)技术 测试不同协议(file, http, ftp等) 8. 实际案例分析 在Pikachu靶场中,通过以下步骤演示XXE: 提交合法XML验证解析功能 尝试内部实体 升级为外部实体读取系统文件 使用PHP包装器读取源码 关键点 :观察服务器如何处理XML输入,特别是是否解析并返回了外部实体内容。