某小型cms代码审计
字数 999 2025-08-09 17:09:26

某小型CMS代码审计分析报告

漏洞概述

本报告分析了某小型CMS的两个版本(v2021.0521152900和v2021.0528154955)中存在的安全漏洞,主要包括:

  1. 任意文件删除漏洞
  2. 任意文件上传漏洞

一、任意文件删除漏洞分析

漏洞位置

  • 核心函数位于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;
}

漏洞成因

  1. 过滤不彻底:path_absolute()函数仅过滤了.././,但未考虑Windows系统下的..\路径遍历
  2. 路径拼接:使用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. 在备份文件目录下创建测试文件(如1.txt)
  2. 构造恶意请求,修改data参数为..\..\path\to\file形式
  3. 发送请求实现任意文件删除

二、任意文件上传漏洞分析

漏洞位置

  • 上传控制文件:upload.class.php
  • 触发点:后台附件上传功能

漏洞代码分析

$mime = substr($file['name'], strrpos($file['name'], ".") + 1);
if (stripos($_L['config']['admin']['mimelist'], $mime) !== false)

漏洞成因

  1. 白名单机制缺陷:仅检查文件扩展名是否在白名单中
  2. 配置问题:白名单可被修改添加危险文件类型
  3. 缺乏完整验证:未验证文件内容与扩展名是否匹配

利用方法

  1. 修改系统配置,将PHP等危险扩展名加入白名单
  2. 直接上传恶意文件(如webshell)

三、版本更新分析

v2021.0528154955版本修复情况

任意文件删除漏洞修复

  1. 添加了对..\.\的过滤
  2. 但修复不彻底,仍可通过特定方式绕过

绕过方法

通过构造特殊payload,使过滤后的结果仍能形成..\路径遍历

四、修复建议

任意文件删除漏洞修复

  1. 完善路径过滤,增加对Windows路径分隔符的检测
  2. 使用realpath()函数解析最终路径
  3. 限制删除操作的范围

任意文件上传漏洞修复

  1. 使用严格的白名单机制
  2. 验证文件内容与扩展名的匹配性
  3. 限制上传目录的执行权限
  4. 对上传文件重命名

五、总结

该CMS存在严重的安全漏洞,特别是:

  1. 任意文件删除漏洞可导致系统文件被恶意删除
  2. 任意文件上传漏洞可导致webshell上传
  3. 版本更新后仍存在绕过可能

开发人员应重视安全编码实践,特别是对用户输入的严格过滤和验证。

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