XML外部实体注入(XXE)漏洞

Web安全学习路径 | 模块3 | 课程7

1. 引言

XML外部实体注入(XML External Entity Injection,简称XXE)是一种针对XML处理器的安全漏洞。攻击者可以通过在XML文档中注入外部实体来读取服务器上的任意文件,执行服务器端请求伪造(SSRF)攻击,或者导致拒绝服务(DoS)攻击。

学习目标: 理解XXE漏洞的原理和危害,掌握各种XXE攻击技术的利用方法,学习有效的防御措施。

2. 基本概念

2.1 XML基础

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。XML文档由以下部分组成:

]> &xxe;

2.2 外部实体

外部实体是XML文档中引用外部资源的实体。常见的实体类型包括:

  • SYSTEM实体:引用外部文件或URL
  • PUBLIC实体:引用公共DTD
  • 参数实体:用于DTD中的条件包含

3. 攻击技术

3.1 文件读取

利用XXE漏洞读取服务器上的文件:

]> &xxe; // 使用PHP包装器 // 使用data协议

3.2 SSRF攻击

利用XXE漏洞进行服务器端请求伪造:

]> &xxe; // 使用gopher协议 // 使用dict协议

3.3 拒绝服务攻击

利用XXE漏洞进行拒绝服务攻击:

]> &lol3;

4. 高级技术

4.1 参数实体注入

利用参数实体进行XXE攻击:

"> %param1; ]> %param2;

4.2 盲注XXE

在无法直接看到响应时使用:

"> %eval; %exfil; ]> test

4.3 绕过WAF

使用各种技术绕过WAF检测:

// 使用UTF-7编码 ]> // 使用CDATA "> // 使用混合编码

5. 防御措施

5.1 禁用外部实体

在XML解析器中禁用外部实体:

// PHP libxml_disable_entity_loader(true); // Java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); // Python from defusedxml.ElementTree import parse

5.2 输入验证

实施严格的输入验证:

// 使用白名单验证 function validateXML($xml) { $allowedDTDs = ['']; if (!in_array($xml->doctype->name, $allowedDTDs)) { throw new Exception('Invalid DTD'); } } // 使用正则表达式 if (preg_match('/

5.3 安全配置

正确配置XML解析器:

// PHP配置 php.ini: allow_url_fopen = Off allow_url_include = Off // Apache配置 httpd.conf: Require all denied // Nginx配置 nginx.conf: location ~ \.xml$ { deny all; }

6. 实践练习

XXE漏洞实战演练

在我们的靶场环境中,你可以安全地练习XXE漏洞的发现和利用。点击下面的按钮开始练习:

开始练习