ThinkPHP 命令执行漏洞-02
字数 1768 2025-08-18 11:38:52
ThinkPHP 命令执行漏洞分析及利用教学文档
漏洞概述
ThinkPHP官方在2019年1月11日发布补丁修复了一个远程代码执行漏洞,影响ThinkPHP 5.0.x和5.1.x版本。该漏洞源于框架对请求方法的处理不当,攻击者可通过构造特殊请求实现任意命令执行。
漏洞影响版本
- ThinkPHP 5.0.x
- ThinkPHP 5.1.x
补丁信息
官方补丁链接:
- 5.0.x补丁: https://github.com/top-think/framework/commit/4a4b5e64fa4c46f851b4004005bff5f3196de003
- 5.1.x补丁: https://github.com/top-think/framework/commit/2454cebcdb6c12b352ac0acd4a4e6b25b31982e6
漏洞分析
漏洞根源
漏洞主要存在于method函数中,该函数处理var_method常量(在application/config.php中初始化为_method)时存在缺陷,导致攻击者可以通过POST参数注入恶意代码。
漏洞触发流程
-
请求处理阶段:
- 实例化Request类
- 由于未设置调度信息,进入URL路由检测函数
self::routeCheck($request, $config) - 通过
$request->path()函数获取路径为captcha
-
路由检测阶段:
- 调用
check()函数 check()函数调用存在漏洞的method函数- 攻击者通过构造
_method参数为__construct,触发构造函数进行参数赋值:method='get', filter[]='system', get[]='whoami'
- 调用
-
自动加载机制:
- ThinkPHP5的自动类加载机制会加载
vendor目录下的文件 - 关键文件:
topthink/think-captcha/src/helper.php - 该文件调用
\think\Route::get函数进行路由注册操作
- ThinkPHP5的自动类加载机制会加载
-
路由解析:
self::rules的值被设置为特定路由配置- 根据传入的URL取得
item的值为captcha rules[item]的值变为captcha路由数组- 调用
self::parseRule函数 - 由于
route的值为\think\captcha\CaptchaController@index,最终路由到该方法
-
命令执行:
- 最终在
run函数中执行实例对象的param方法 - 由于参数已被污染,导致任意命令执行
- 最终在
漏洞利用
利用条件
- 目标系统使用ThinkPHP 5.0.x或5.1.x版本
- 未安装2019年1月11日的安全补丁
- 系统启用了captcha路由(默认情况下通常启用)
利用Payload
构造POST请求,包含以下参数:
_method=__construct&method=get&filter[]=system&get[]=whoami
利用步骤
- 发送POST请求到目标ThinkPHP应用的
/index.php或相关入口文件 - 在请求中包含上述恶意参数
- 系统会执行
whoami命令并返回结果
防御措施
-
立即升级:
- 升级到官方最新版本
- 应用官方提供的补丁
-
输入验证:
- 对所有用户输入进行严格验证
- 特别是对
_method参数进行严格限制
-
禁用危险函数:
- 在php.ini中禁用
system等危险函数
- 在php.ini中禁用
-
最小权限原则:
- Web服务器运行用户应具有最小必要权限
-
WAF规则:
- 在Web应用防火墙中添加针对ThinkPHP特定漏洞的防护规则
技术细节
关键代码分析
漏洞主要存在于Request类的method方法中,当攻击者通过_method参数传入__construct时,可以覆盖类的构造函数,进而控制后续的参数处理流程。
漏洞利用链
- 通过
_method=__construct触发Request类的构造函数覆盖 - 通过
method=get设置请求方法 - 通过
filter[]=system设置过滤器为系统命令执行 - 通过
get[]=whoami设置要执行的命令 - 系统在处理路由时最终执行被污染的过滤器
总结
该漏洞是ThinkPHP框架中的一个高危远程代码执行漏洞,攻击者无需认证即可利用。开发人员应立即检查系统版本并应用补丁,系统管理员应监控相关日志以检测可能的攻击尝试。