某小型cms代码审计
字数 999 2025-08-09 17:09:26
某小型CMS代码审计分析报告
漏洞概述
本报告分析了某小型CMS的两个版本(v2021.0521152900和v2021.0528154955)中存在的安全漏洞,主要包括:
- 任意文件删除漏洞
- 任意文件上传漏洞
一、任意文件删除漏洞分析
漏洞位置
- 核心函数位于
delfile()和path_absolute()函数中 - 触发点在后台备份功能的删除操作中
漏洞代码分析
1. delfile()函数
function delfile($fileUrl) {
$fileUrl = path_absolute($fileUrl);
$fileUrl = stristr(PHP_OS, "WIN") ? utf82gbk($fileUrl) : $fileUrl;
@clearstatcache();
return is_file($fileUrl) ? unlink($fileUrl) : false;
}
2. path_absolute()函数
function path_absolute($path) {
$path = PATH_WEB . str_replace(["../", "./", PATH_WEB], "", $path);
$path = str_replace("\/", "\\", $path);
return is_dir($path) ? path_standard($path) : $path;
}
漏洞成因
- 过滤不彻底:
path_absolute()函数仅过滤了../和./,但未考虑Windows系统下的..\路径遍历 - 路径拼接:使用
PATH_WEB与用户输入直接拼接,未做充分验证
触发路径
后台备份功能的删除操作(database.class.php):
case 'del':
$file = PATH_WEB . 'backup/data/{$_L['form']['name']}';
if (is_file($file)) {
delfile($file);
ajaxout(1, '删除成功');
} else {
ajaxout(0, '文件不存在');
}
break;
利用方法
- 在备份文件目录下创建测试文件(如1.txt)
- 构造恶意请求,修改
data参数为..\..\path\to\file形式 - 发送请求实现任意文件删除
二、任意文件上传漏洞分析
漏洞位置
- 上传控制文件:
upload.class.php - 触发点:后台附件上传功能
漏洞代码分析
$mime = substr($file['name'], strrpos($file['name'], ".") + 1);
if (stripos($_L['config']['admin']['mimelist'], $mime) !== false)
漏洞成因
- 白名单机制缺陷:仅检查文件扩展名是否在白名单中
- 配置问题:白名单可被修改添加危险文件类型
- 缺乏完整验证:未验证文件内容与扩展名是否匹配
利用方法
- 修改系统配置,将PHP等危险扩展名加入白名单
- 直接上传恶意文件(如webshell)
三、版本更新分析
v2021.0528154955版本修复情况
任意文件删除漏洞修复
- 添加了对
..\和.\的过滤 - 但修复不彻底,仍可通过特定方式绕过
绕过方法
通过构造特殊payload,使过滤后的结果仍能形成..\路径遍历
四、修复建议
任意文件删除漏洞修复
- 完善路径过滤,增加对Windows路径分隔符的检测
- 使用
realpath()函数解析最终路径 - 限制删除操作的范围
任意文件上传漏洞修复
- 使用严格的白名单机制
- 验证文件内容与扩展名的匹配性
- 限制上传目录的执行权限
- 对上传文件重命名
五、总结
该CMS存在严重的安全漏洞,特别是:
- 任意文件删除漏洞可导致系统文件被恶意删除
- 任意文件上传漏洞可导致webshell上传
- 版本更新后仍存在绕过可能
开发人员应重视安全编码实践,特别是对用户输入的严格过滤和验证。