XXE漏洞原理及简单利用
什么是XXE
XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
XXE漏洞原理
XML可以从外部读取DTD文件的话,那么就可以想一下,如果把读取文件的路径换成另一个文件的路径,那么是否可以读取到这个文件。如果把路径指向一个内网端口,是否能探测内部端口。另外,服务器解析XML,要么一次性加载,要么是一部分一部分的去加载,递归调用XML定义,一次性调用超量的定义,那么服务器内存就会消耗光,造成拒绝服务攻击。
- 读取文件
- 命令执行
- 内网探测
- DDOS攻击
- 钓鱼
简单XXE漏洞代码编写
- 常用函数介绍
file_get_contents()函数把整个文件读入一个字符串中
php://input是个可以访问请求的原始数据的只读流
1 |
|
simplexml_load_string函数
将xml格式字符串转换为对应的simpleXMLElement
1 |
|
XML注入回显 输出函数
print_r()
编写简单的XXE漏洞
1 |
|
eg.
环境搭建
读取本地文件payload
1 | <?xml version="1.0" encoding="utf-8"?> |
使用bp抓包
修改请求方式,上传payload,读取C盘下的Windows.ini这个文件
成功读取到这个文件。
漏洞利用-任意文件读取
php中测试POC
1 | file:///path/to/file.txt |
读取文件(有回显)
paylaod
1 |
|
读取php文件
读取文件(无回显)
print_r($data);
输出了我们查询的结果,如果没有这个函数的话,只有使用Blind XXE来构建一条带外信道提取数据。
请求服务器,服务器会再次向我们搭建的服务器请求dtd文件
1 | <?xml version="1.0"?> |
构造服务器的dtd
1 | <!ENTITY % p1 SYSTEM "file:///etc/passwd"> |
服务器请求到这个dtd之后,会开始解析。然后把得到的密码通过请求参数再次访问我们的服务器,从而造成数据外带,我们可以通过抓包获取到信息。
XXE漏洞发现与防御
抓包引用外部实体来探测是否存在XXE漏洞
1 |
|
如何防御?
- 禁用外部实体
- 过滤用户提交的参数(XML的关键词)
参考链接
https://www.freebuf.com/articles/web/177979.html