ThinkCMFX 前台getshell漏洞分析
字数 1353 2025-08-26 22:11:34
ThinkCMFX 前台漏洞分析与利用教学文档
1. 漏洞概述
ThinkCMFX 是基于 ThinkPHP 3.2.3 开发的中文内容管理框架,存在两个严重的前台漏洞:
- 前台文件包含漏洞(可导致代码执行)
- 前台任意文件上传漏洞
2. 前台文件包含漏洞分析
2.1 漏洞成因
漏洞根源在于 ThinkCMFX 从 ThinkPHP 3.2.3 抽象出的 HomebaseController 类中,fetch 方法被设置为 public 而非 protected,导致前台可直接调用。该方法最终将用户可控内容直接拼接至 eval 语句中执行。
2.2 漏洞调用链
- 攻击者通过前台调用
HomebaseController.php的fetch方法 - 方法调用链:
fetch→thinkphp controller→think view - 在
View类的fetch方法中,可控的$content被直接拼接至eval语句 - 调用链继续:
Hook::listen→view_parse→exec→run - 最终在
loadTemplate方法中,可控变量被编译并加载执行
2.3 关键代码分析
// View 类中的 fetch 方法
public function fetch($templateFile='',$content='',$prefix='') {
// ...
if(''===$content) {
$content = $this->fetch($templateFile);
}
// 直接拼接至 eval
$this->engine->fetch($content);
}
// 编译模板内容
protected function compiler($tmplContent) {
// 可控的 $tmplContent 直接拼接至 PHP 代码
$content = '<?php '.$tmplContent.' ?>';
return $content;
}
// Storage::load 方法执行文件包含
public static function load($_filename, $vars=null) {
// ...
include $_filename;
}
2.4 漏洞修复
官方修复方式是将 fetch 方法改为 protected,限制前台直接调用。
3. 前台任意文件上传漏洞分析
3.1 漏洞位置
漏洞位于 \application\Asset\Controller\UeditorController.class.php 中的 _ueditor_upload 方法。
3.2 漏洞成因
- 上传流程:
upload→uploadimage→_ueditor_upload - 关键问题在于
checkExt方法对文件后缀检查不严格 - 虽然定义了允许的后缀名,但检查逻辑存在问题,导致可以上传任意后缀文件
3.3 关键代码分析
// UeditorController.class.php
public function _ueditor_upload() {
// 设置上传信息
$config = array(
"pathFormat" => $CONFIG['imagePathFormat'],
"maxSize" => $CONFIG['imageMaxSize'],
"allowFiles" => $CONFIG['imageAllowFiles']
);
// 获取上传后缀
$fieldName = $CONFIG['imageFieldName'];
// 调用 think 的 upload 方法
$info = $this->upload($fieldName, $config);
}
// upload.class.php 中的 check 方法
public function check($file) {
// 文件后缀检查存在问题
$file['ext'] = pathinfo($file['name'], PATHINFO_EXTENSION);
// 没有严格验证后缀是否在允许列表中
return true;
}
// getSaveName 方法生成文件名
public function getSaveName($file) {
// 直接使用上传文件的后缀
$savename = $this->saveName.'_'.$file['ext'];
return $savename;
}
3.4 漏洞利用
- 攻击者可构造恶意 PHP 文件上传
- 虽然系统对图像文件有额外检测(
getimagesize),但非图像文件不受此限制 - 上传后可直接访问上传的 PHP 文件执行任意代码
4. 漏洞复现指南
4.1 文件包含漏洞复现
- 构造恶意请求调用
HomebaseController的fetch方法 - 通过参数注入 PHP 代码
- 观察代码执行结果
4.2 文件上传漏洞复现
- 访问 Ueditor 上传接口
- 构造上传请求,修改文件后缀为 PHP
- 上传恶意 PHP 文件
- 访问上传的文件验证代码执行
5. 防护建议
- 升级到官方修复版本
- 对于文件包含漏洞:
- 确保敏感方法设置为
protected - 对用户输入进行严格过滤
- 确保敏感方法设置为
- 对于文件上传漏洞:
- 实现严格的文件后缀检查
- 对上传文件内容进行验证
- 限制上传目录的执行权限
6. 总结
ThinkCMFX 的这两个前台漏洞都源于对用户输入的不当处理:
- 文件包含漏洞暴露了框架设计上的权限控制问题
- 文件上传漏洞展示了安全检查不充分的后果
开发者在使用框架时应:
- 理解框架的安全机制
- 不轻易修改核心类的访问权限
- 对所有用户输入保持怀疑态度并实施严格验证