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

补丁信息

官方补丁链接:

漏洞分析

漏洞根源

漏洞主要存在于method函数中,该函数处理var_method常量(在application/config.php中初始化为_method)时存在缺陷,导致攻击者可以通过POST参数注入恶意代码。

漏洞触发流程

  1. 请求处理阶段

    • 实例化Request类
    • 由于未设置调度信息,进入URL路由检测函数self::routeCheck($request, $config)
    • 通过$request->path()函数获取路径为captcha
  2. 路由检测阶段

    • 调用check()函数
    • check()函数调用存在漏洞的method函数
    • 攻击者通过构造_method参数为__construct,触发构造函数进行参数赋值:
      method='get', filter[]='system', get[]='whoami'
      
  3. 自动加载机制

    • ThinkPHP5的自动类加载机制会加载vendor目录下的文件
    • 关键文件:topthink/think-captcha/src/helper.php
    • 该文件调用\think\Route::get函数进行路由注册操作
  4. 路由解析

    • self::rules的值被设置为特定路由配置
    • 根据传入的URL取得item的值为captcha
    • rules[item]的值变为captcha路由数组
    • 调用self::parseRule函数
    • 由于route的值为\think\captcha\CaptchaController@index,最终路由到该方法
  5. 命令执行

    • 最终在run函数中执行实例对象的param方法
    • 由于参数已被污染,导致任意命令执行

漏洞利用

利用条件

  • 目标系统使用ThinkPHP 5.0.x或5.1.x版本
  • 未安装2019年1月11日的安全补丁
  • 系统启用了captcha路由(默认情况下通常启用)

利用Payload

构造POST请求,包含以下参数:

_method=__construct&method=get&filter[]=system&get[]=whoami

利用步骤

  1. 发送POST请求到目标ThinkPHP应用的/index.php或相关入口文件
  2. 在请求中包含上述恶意参数
  3. 系统会执行whoami命令并返回结果

防御措施

  1. 立即升级

    • 升级到官方最新版本
    • 应用官方提供的补丁
  2. 输入验证

    • 对所有用户输入进行严格验证
    • 特别是对_method参数进行严格限制
  3. 禁用危险函数

    • 在php.ini中禁用system等危险函数
  4. 最小权限原则

    • Web服务器运行用户应具有最小必要权限
  5. WAF规则

    • 在Web应用防火墙中添加针对ThinkPHP特定漏洞的防护规则

技术细节

关键代码分析

漏洞主要存在于Request类的method方法中,当攻击者通过_method参数传入__construct时,可以覆盖类的构造函数,进而控制后续的参数处理流程。

漏洞利用链

  1. 通过_method=__construct触发Request类的构造函数覆盖
  2. 通过method=get设置请求方法
  3. 通过filter[]=system设置过滤器为系统命令执行
  4. 通过get[]=whoami设置要执行的命令
  5. 系统在处理路由时最终执行被污染的过滤器

总结

该漏洞是ThinkPHP框架中的一个高危远程代码执行漏洞,攻击者无需认证即可利用。开发人员应立即检查系统版本并应用补丁,系统管理员应监控相关日志以检测可能的攻击尝试。

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 ,触发构造函数进行参数赋值: 自动加载机制 : ThinkPHP5的自动类加载机制会加载 vendor 目录下的文件 关键文件: topthink/think-captcha/src/helper.php 该文件调用 \think\Route::get 函数进行路由注册操作 路由解析 : 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请求,包含以下参数: 利用步骤 发送POST请求到目标ThinkPHP应用的 /index.php 或相关入口文件 在请求中包含上述恶意参数 系统会执行 whoami 命令并返回结果 防御措施 立即升级 : 升级到官方最新版本 应用官方提供的补丁 输入验证 : 对所有用户输入进行严格验证 特别是对 _method 参数进行严格限制 禁用危险函数 : 在php.ini中禁用 system 等危险函数 最小权限原则 : Web服务器运行用户应具有最小必要权限 WAF规则 : 在Web应用防火墙中添加针对ThinkPHP特定漏洞的防护规则 技术细节 关键代码分析 漏洞主要存在于Request类的 method 方法中,当攻击者通过 _method 参数传入 __construct 时,可以覆盖类的构造函数,进而控制后续的参数处理流程。 漏洞利用链 通过 _method=__construct 触发Request类的构造函数覆盖 通过 method=get 设置请求方法 通过 filter[]=system 设置过滤器为系统命令执行 通过 get[]=whoami 设置要执行的命令 系统在处理路由时最终执行被污染的过滤器 总结 该漏洞是ThinkPHP框架中的一个高危远程代码执行漏洞,攻击者无需认证即可利用。开发人员应立即检查系统版本并应用补丁,系统管理员应监控相关日志以检测可能的攻击尝试。