ThinkPHP 命令执行漏洞-01
字数 1401 2025-08-18 11:38:49
ThinkPHP 5.x 远程代码执行漏洞分析及防御指南
漏洞概述
ThinkPHP官方于2018年12月9日发布重要安全更新,修复了一个严重的远程代码执行漏洞。该漏洞源于框架对控制器名检测不严格,在未开启强制路由的情况下可能导致攻击者执行任意代码(getshell)。
受影响版本
- ThinkPHP 5.x < 5.1.31
- ThinkPHP 5.x <= 5.0.23
漏洞原理分析
漏洞触发点
漏洞利用的核心在于ThinkPHP框架对控制器名的处理机制存在缺陷,攻击者可以通过特殊构造的URL调用任意类的方法。
漏洞利用流程
-
请求处理流程:
- 请求通过
index.php入口文件加载ThinkPHP框架 - 执行
think\App::run()方法 - 进入路由检测方法
routeCheck()
- 请求通过
-
路径信息获取:
- 框架从GET参数's'中获取pathinfo信息(默认配置'var_pathinfo'为's')
- 示例恶意payload:
index/think\App/invokefunction
-
路由解析:
Route::parseUrl()调用parseUrlPath()方法- 仅通过'/'分割路径,未进行充分过滤
-
控制器实例化:
Loader::controller方法解析控制器名为"think\app"- 通过
App::invokeClass($class)实例化指定类
-
方法调用:
- 最终通过
invokeMethod调用call_user_func_array - 执行攻击者指定的系统命令
- 最终通过
POC示例
http://localhost:8888/index.php?s=index/think\App/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
漏洞补丁分析
5.0.x版本补丁
补丁地址:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f
主要修复内容:
- 加强了对控制器名的合法性检查
- 增加了对特殊字符的过滤
5.1.x版本补丁
补丁地址:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815
主要修复内容:
- 改进了路由解析机制
- 增加了更严格的安全检查
防御措施
-
立即升级:
- 升级到ThinkPHP 5.1.31或更高版本
- 或升级到ThinkPHP 5.0.23以上版本
-
配置加固:
- 开启强制路由配置('url_route_must' => true)
- 限制可访问的控制器范围
-
其他安全建议:
- 部署WAF防护
- 定期进行安全审计
- 遵循最小权限原则运行Web服务
技术细节深入
漏洞利用关键点
-
命名空间利用:
- 通过反斜杠
\实现命名空间跳转 - 绕过默认的控制器限制
- 通过反斜杠
-
动态方法调用:
- 利用
invokefunction调用任意类方法 - 通过
call_user_func_array实现命令执行
- 利用
-
参数传递机制:
- 通过vars数组传递执行参数
- 实现任意命令的参数传递
漏洞利用限制条件
- 必须未开启强制路由
- 需要知道或猜测框架安装路径
- 需要Web服务器有执行系统命令的权限
总结
该漏洞是ThinkPHP框架中一个典型的安全问题,源于对用户输入验证不足导致的远程代码执行。开发人员应及时升级到安全版本,并遵循安全开发最佳实践,避免类似漏洞的发生。