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搭建靶场,访问地址如下图:

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

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

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

漏洞总结:
逻辑代码大体如下:
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)。

浙公网安备 33010602011771号