文件包含 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 请求处理流程
- 入口文件:定义框架路径、项目路径、调试模式和应用模式等
- 配置文件:定义了默认路由值:
- 默认模块:Portal
- 默认控制器:index
- 默认方法:index
4.2 关键代码执行路径
- 请求首先到达默认控制器IndexController的index方法
- 调用display方法(继承自父类)
- 父类中的display方法又调用View类的display方法
- View类的display方法调用fetch方法
4.3 漏洞触发点
在View类的fetch方法中,存在以下关键处理:
$this->fetch($templateFile, $prefix, $content)
其中:
$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. 流程图解
请求 → 入口文件 → 默认控制器 → display方法 → View::display → fetch →
loadTemplate → (文件存在?读取内容:使用content参数) →
Storage::put → File::put → 写入文件 → include执行
此流程图清晰展示了漏洞触发的完整路径,有助于理解漏洞的形成过程。