昨天在论坛遇到一同学求助,找到一个thinkphp的站点,存在远程代码执行漏洞,但是有宝塔防火墙没法一键getshell,几经尝试之后利用远程下载和文件包含成功绕过宝塔,又利用蚁剑自定义编解码插件,完美绕过

主要限制

请求体中不能含有eval、system等关键字
php启用了disable_functions
无法直接用scandir扫描网站目录
菜刀或蚁剑连接也不能出现eval、system等关键字

直接进入正题吧,该漏洞是1月份爆出的THINKPHP 5.0.X-5.0.23、5.1.X、5.2.X 全版本远程代码执行漏洞,目标thinkphp版本是5.1.12,试了几个poc不管用,@cimoom直接给我测试成功的poc和相应的shell,如图所示

1.png

经过几轮测试发现只有这个shell可用,各种变形绕过虽然能成功绕过宝塔防御,但是没有回显,后来才发现php做了安全限制,getshell后看到phpinfo,限制了大部分命令执行/代码执行函数

passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

2.png

发送请求后触发异常,会把日志写入到runtime/log/201904/19.log,包括完整的post请求,因此可以直接往log里写入shell。此处一个坑是由于目标站点用户较多日志被不断覆盖,所以要反复发送这个请求写入shell。之后利用think__include_file控制器包含文件

3.png

理论上说到这里就已经成功了,但是后面每次都要写不同的php代码来查看目标的信息,而且不能含有危险函数否则会被宝塔拦截,同时这个包含又时不时失败,可以说很不友好了,我们的目标是真正getshell,利用菜刀或蚁剑连接。

现在的情况是,目标存在thinkphp漏洞,我们可以把php代码写入日志后去包含它,进而执行代码。但是有几点限制:

不能含有eval、passthru等,甚至不能含有phpinfo
日志文件很快被覆盖
网站目录被宝塔限制防篡改,无法写入文件

这时的思路是,写入一个下载远程文件的shell然后包含,把远程shell写入可写目录,再次去包含真正的shell,即可绕过宝塔

于是发送下载远程文件的php代码,在远程开一台httpserver,注意加一层url编码防止被拦截,把shell写入/tmp目录

4.png

查看一下,看到成功写入

5.png

注意此处,直接var_dump(scandir('/tmp'))会被拦截,所以借助中间变量绕过

然后再次包含/tmp/123就可以了

6.png

再然后,用蚁剑连接,密码data,配置相应的post参数,选择对应的解码器

7.png

8.png

重点来了,刚才说过,宝塔会拦截菜刀和蚁剑默认的eval,所以就算能包含成功也无法连接上,这时就要用到我上次发在论坛的这个技巧,https://www.t00ls.net/thread-49320-1-1.html,简单说就是使用Multipart发包,同时隐藏eval关键字,再破坏base64编码,这样一来就算目标站点启用了流量监测,我们的webshell通信流量也不会被马上识别出来

9.png

最后,分享给大家这个一句话和蚁剑编解码器

antsword.zip

标签: ThinkPHP5远程代码执行漏洞

添加新评论