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. 漏洞产生条件
- 应用程序解析XML输入
- XML解析器配置允许外部实体解析
- 未对用户输入的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漏洞时:
- 尝试基本的XXE payload
- 检查错误响应差异
- 尝试带外(OOB)技术
- 测试不同协议(file, http, ftp等)
8. 实际案例分析
在Pikachu靶场中,通过以下步骤演示XXE:
- 提交合法XML验证解析功能
- 尝试内部实体
- 升级为外部实体读取系统文件
- 使用PHP包装器读取源码
关键点:观察服务器如何处理XML输入,特别是是否解析并返回了外部实体内容。