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;
}