某国外cms代码审计
字数 1342 2025-08-07 08:22:09
RITEcms 文件上传与任意文件删除漏洞分析
漏洞概述
本文详细分析RITEcms系统中存在的两个安全漏洞:
- 不安全文件上传漏洞
- 任意文件删除漏洞
这两个漏洞存在于最新版本的RITEcms中,攻击者可以利用默认凭证进入后台,进而上传恶意文件或删除系统重要文件。
漏洞环境
- 系统版本:RITEcms最新版
- 默认后台凭证:admin/admin
- 后台入口:admin.php
漏洞详细分析
1. 文件上传漏洞分析
漏洞触发路径
- 访问admin.php,使用默认凭证admin/admin登录
- 再次访问admin.php进入后台
- 导航至File Manager → Upload file
- 选择文件并上传
代码审计路径
- 入口文件:admin.php → 包含filemanage.inc.php文件
- 上传函数:filemanage.inc.php中的fileupload函数
// 实例化FileUpload类
$upload = new FileUpload($_FILES['file'], $directory);
- FileUpload类:位于cms/includes/classes/FileUpload.class.php
class FileUpload {
public function __construct($upload, $uploadDir) {
$this->upload = $upload;
$this->uploadDir = $uploadDir;
}
// 文件移动操作
public function moveUploadedFile($tempFileName) {
move_uploaded_file($this->upload['tmp_name'], $this->uploadDir.$tempFileName);
}
}
-
关键参数分析:
$this->upload['tmp_name']:上传文件的临时路径$this->uploadDir:由BASE_PATH.$directory.'/'构成$tempFileName:上传后的文件名
-
BASE_PATH定义:/data/settings.php中定义
define('BASE_PATH', dirname(dirname(__FILE__)));
-
directory参数:
- 如果条件为true:使用/files目录
- 如果条件为false:使用/media目录
-
文件保存逻辑:
- 当条件为false时,调用saveFile函数
- 使用copy函数直接复制临时文件
public function saveFile($filename='') {
copy($this->upload['tmp_name'], $this->uploadDir.$filename);
}
漏洞成因
- 缺乏文件类型检查
- 缺乏文件扩展名过滤
- 直接使用用户提供的文件名
- 使用copy函数而非安全的移动函数
2. 任意文件删除漏洞分析
漏洞触发条件
- 传递delete参数
- 存在confirmed参数
漏洞代码
位于filemanager.inc.php中:
if (isset($_GET['delete']) && isset($_GET['confirmed'])) {
unlink(BASE_PATH.$_GET['delete']);
}
漏洞成因
- 直接使用用户提供的路径参数
- 缺乏路径校验和过滤
- 结合BASE_PATH可以删除系统任意文件
漏洞利用方式
文件上传漏洞利用
- 构造恶意文件(如PHP webshell)
- 通过后台文件上传功能上传
- 访问上传的文件执行任意代码
任意文件删除漏洞利用
- 构造delete参数指向系统重要文件
- 如:
?delete=/data/settings.php
- 如:
- 添加confirmed参数确认删除
- 导致系统重要文件被删除,可能造成拒绝服务
修复建议
文件上传漏洞修复
- 实现严格的文件类型检查:
$allowedTypes = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowedTypes)) {
die('Invalid file type');
}
- 限制文件扩展名:
$allowedExtensions = ['jpg', 'png', 'gif'];
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array(strtolower($extension), $allowedExtensions)) {
die('Invalid file extension');
}
- 生成随机文件名:
$filename = md5(uniqid()).'.'.$extension;
- 使用move_uploaded_file而非copy
任意文件删除漏洞修复
- 限制可删除的文件路径:
$allowedPaths = ['/files/', '/media/'];
$path = BASE_PATH.$_GET['delete'];
$allowed = false;
foreach ($allowedPaths as $allowedPath) {
if (strpos($path, $allowedPath) === 0) {
$allowed = true;
break;
}
}
if (!$allowed) {
die('Invalid file path');
}
- 添加CSRF防护
- 实现权限检查
总结
RITEcms系统中存在两个高危漏洞:
- 不安全的文件上传机制允许攻击者上传任意文件
- 缺乏过滤的文件删除功能允许删除系统任意文件
这两个漏洞组合使用可以导致完全的系统沦陷。建议开发者立即修复,用户应避免使用默认凭证并及时更新系统。
参考资源
- RITEcms源代码:https://ritecms.com/download
- 原始漏洞报告:奇安信攻防社区