ThinkPHP-lang-rce漏洞复现

漏洞背景

  ThinkPHP 是国内使用极为广泛的 PHP 开发框架,广泛应用于政企后台、CMS、商城等系统。其内置的多语言包机制通过  lang  参数动态加载语言文件,如: http://example.com/index.php?lang=zh-cn ,在 ThinkPHP 6.0.13 之前版本中,如果启用了多语言功能,lang 参数未经严格校验,直接拼接路径进行语言文件加载,从而导致本地文件包含漏洞(Local File Inclusion, LFI)

  漏洞触发点位于语言加载过程中对  lang  参数的路径拼接。虽然这个本地文件包含漏洞 只能包含现有 .php 文件,但攻击者仍然可以通过配合其他组件如  pearcmd.php  的任意文件写入功能,写入恶意 .php 文件,再通过 LFI 包含并执行,实现远程命令执行(RCE)。

  何为组件 pearcmd.php  , pearcmd.php  是 PEAR 工具的命令入口文件 PEAR 是 PHP 的包管理工具, pearcmd.php  是它的命令行接口文件,通常存在于: /usr/local/lib/php/pearcmd.php ,它支持通过 GET 请求执行命令,比如安装包、生成文件等。

漏洞复现

通过vulhub搭建靶场,访问地址如下图:

image

 首先,由于多语言功能默认没有启用,可以尝试包含以下内容public/index.php来判断是否存在漏洞。地址为: http://l192.168.49.1518080/?lang=../../../../../public/index ,如下图:

image

如果服务器崩溃并返回 500 错误响应,则存在该漏洞。然后尝试通过/usr/local/lib/php/pearcmd.php 写入数据(pearcmd 的  config-create  命令会把内容写入指定文件)。如下图:

image

如果服务器响应pearcmd的输出,则表示漏洞利用成功。然后访问 http://192.168.49.151:8080/shell.php ,如果出现了phpinfo页面表明利用成功了。如下图:

image

 漏洞总结:

逻辑代码大体如下:

1 $langSet = input('get.lang');
2 $langFile = app_path() . 'lang' . DIRECTORY_SEPARATOR . $langSet . '.php';
3 include $langFile;

利用  /usr/local/lib/php/pearcmd.php  实现 将攻击者指定内容写入服务器上的  shell.php  文件,然后通过 ThinkPHP 的  lang  参数包含并执行它,最终达到 远程代码执行(RCE)

posted @ 2025-08-04 15:34  ZyonSec  阅读(329)  评论(0)    收藏  举报