ThinkCMFX 前台getshell漏洞分析
字数 1353 2025-08-26 22:11:34

ThinkCMFX 前台漏洞分析与利用教学文档

1. 漏洞概述

ThinkCMFX 是基于 ThinkPHP 3.2.3 开发的中文内容管理框架,存在两个严重的前台漏洞:

  1. 前台文件包含漏洞(可导致代码执行)
  2. 前台任意文件上传漏洞

2. 前台文件包含漏洞分析

2.1 漏洞成因

漏洞根源在于 ThinkCMFX 从 ThinkPHP 3.2.3 抽象出的 HomebaseController 类中,fetch 方法被设置为 public 而非 protected,导致前台可直接调用。该方法最终将用户可控内容直接拼接至 eval 语句中执行。

2.2 漏洞调用链

  1. 攻击者通过前台调用 HomebaseController.phpfetch 方法
  2. 方法调用链:fetchthinkphp controllerthink view
  3. View 类的 fetch 方法中,可控的 $content 被直接拼接至 eval 语句
  4. 调用链继续:Hook::listenview_parseexecrun
  5. 最终在 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 漏洞成因

  1. 上传流程:uploaduploadimage_ueditor_upload
  2. 关键问题在于 checkExt 方法对文件后缀检查不严格
  3. 虽然定义了允许的后缀名,但检查逻辑存在问题,导致可以上传任意后缀文件

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 漏洞利用

  1. 攻击者可构造恶意 PHP 文件上传
  2. 虽然系统对图像文件有额外检测(getimagesize),但非图像文件不受此限制
  3. 上传后可直接访问上传的 PHP 文件执行任意代码

4. 漏洞复现指南

4.1 文件包含漏洞复现

  1. 构造恶意请求调用 HomebaseControllerfetch 方法
  2. 通过参数注入 PHP 代码
  3. 观察代码执行结果

4.2 文件上传漏洞复现

  1. 访问 Ueditor 上传接口
  2. 构造上传请求,修改文件后缀为 PHP
  3. 上传恶意 PHP 文件
  4. 访问上传的文件验证代码执行

5. 防护建议

  1. 升级到官方修复版本
  2. 对于文件包含漏洞:
    • 确保敏感方法设置为 protected
    • 对用户输入进行严格过滤
  3. 对于文件上传漏洞:
    • 实现严格的文件后缀检查
    • 对上传文件内容进行验证
    • 限制上传目录的执行权限

6. 总结

ThinkCMFX 的这两个前台漏洞都源于对用户输入的不当处理:

  1. 文件包含漏洞暴露了框架设计上的权限控制问题
  2. 文件上传漏洞展示了安全检查不充分的后果

开发者在使用框架时应:

  • 理解框架的安全机制
  • 不轻易修改核心类的访问权限
  • 对所有用户输入保持怀疑态度并实施严格验证
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 关键代码分析 2.4 漏洞修复 官方修复方式是将 fetch 方法改为 protected ,限制前台直接调用。 3. 前台任意文件上传漏洞分析 3.1 漏洞位置 漏洞位于 \application\Asset\Controller\UeditorController.class.php 中的 _ueditor_upload 方法。 3.2 漏洞成因 上传流程: upload → uploadimage → _ueditor_upload 关键问题在于 checkExt 方法对文件后缀检查不严格 虽然定义了允许的后缀名,但检查逻辑存在问题,导致可以上传任意后缀文件 3.3 关键代码分析 3.4 漏洞利用 攻击者可构造恶意 PHP 文件上传 虽然系统对图像文件有额外检测( getimagesize ),但非图像文件不受此限制 上传后可直接访问上传的 PHP 文件执行任意代码 4. 漏洞复现指南 4.1 文件包含漏洞复现 构造恶意请求调用 HomebaseController 的 fetch 方法 通过参数注入 PHP 代码 观察代码执行结果 4.2 文件上传漏洞复现 访问 Ueditor 上传接口 构造上传请求,修改文件后缀为 PHP 上传恶意 PHP 文件 访问上传的文件验证代码执行 5. 防护建议 升级到官方修复版本 对于文件包含漏洞: 确保敏感方法设置为 protected 对用户输入进行严格过滤 对于文件上传漏洞: 实现严格的文件后缀检查 对上传文件内容进行验证 限制上传目录的执行权限 6. 总结 ThinkCMFX 的这两个前台漏洞都源于对用户输入的不当处理: 文件包含漏洞暴露了框架设计上的权限控制问题 文件上传漏洞展示了安全检查不充分的后果 开发者在使用框架时应: 理解框架的安全机制 不轻易修改核心类的访问权限 对所有用户输入保持怀疑态度并实施严格验证