若依CMS 4.7.x版本代码审计与分析
字数 1285 2025-08-10 17:51:54

若依CMS 4.7.x版本代码审计与分析教学文档

1. 系统概述

若依CMS是一个基于Spring Boot的权限管理系统,4.7.x版本存在一些安全漏洞,特别是定时任务功能导致的任意文件下载漏洞。

2. 漏洞分析

2.1 定时任务导致的任意文件下载漏洞

漏洞位置

  • 文件路径:com.ruoyi.web.controller.common.resourceDownload
  • 相关配置:application-druid.yml(数据库配置)
  • 关键类:com.ruoyi.common.config.RuoYiConfig

漏洞原理

  1. 文件下载机制

    • 系统通过resourceDownload实现文件下载功能
    • 下载路径由RuoYiConfig.getProfile()获取,默认为D:/ruoyi/uploadPath
    • 下载前会进行白名单校验,但htm扩展名也在允许列表中
  2. 关键代码分析

// 数据库资源地址 downloadPath为D:/ruoyi/uploadPath
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称 downloadName为uploadPath
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
  1. 定时任务功能
    • 系统定时任务可以直接调用Bean的对应方法
    • RuoYiConfig类与application.yml关联,其中profile设置了文件下载路径
    • 攻击者可以通过定时任务的set方法修改下载路径配置

利用条件

  • 需要具备定时任务配置权限
  • 需要了解系统默认配置路径

影响范围

  • 若依CMS 4.7.6和4.7.7版本

3. 漏洞复现步骤

  1. 环境准备

    • 部署若依CMS 4.7.6或4.7.7版本
    • 配置application-druid.yml中的数据库信息
  2. 利用定时任务修改配置

    • 通过定时任务接口调用RuoYiConfig的set方法
    • 修改profile配置指向敏感文件路径
  3. 触发文件下载

    • 访问resourceDownload接口
    • 通过构造特定参数绕过白名单检查
    • 下载系统任意文件

4. 修复建议

  1. 代码层面修复

    • 严格限制文件下载的白名单,移除htm等非必要扩展名
    • 对下载路径进行更严格的校验
    • 限制定时任务可调用的方法范围
  2. 配置层面修复

    • 限制profile配置的修改权限
    • 设置更安全的默认下载路径
  3. 版本升级

    • 升级到最新版本,官方可能已修复此漏洞

5. 深入分析

5.1 白名单绕过机制

  • 当前白名单检查存在缺陷,允许htm扩展名
  • 攻击者可利用此特性构造特殊文件名绕过检查

5.2 配置注入风险

  • RuoYiConfig类与配置文件直接关联
  • 通过反射或定时任务可间接修改关键配置
  • 缺乏配置修改的权限控制和审计日志

6. 防御措施

  1. 输入验证

    • 实现更严格的文件路径和名称验证
    • 使用正则表达式确保只允许安全字符
  2. 权限控制

    • 对文件下载功能增加权限检查
    • 限制定时任务的功能范围
  3. 日志审计

    • 记录所有文件下载操作
    • 监控配置文件的修改行为

7. 总结

若依CMS 4.7.x版本的任意文件下载漏洞主要源于:

  1. 不完善的白名单检查机制
  2. 定时任务功能过于强大且缺乏限制
  3. 配置文件可被间接修改且缺乏保护

通过综合分析系统架构和代码实现,可以更全面地理解此类漏洞的产生原因和利用方式,从而制定更有效的防御策略。

若依CMS 4.7.x版本代码审计与分析教学文档 1. 系统概述 若依CMS是一个基于Spring Boot的权限管理系统,4.7.x版本存在一些安全漏洞,特别是定时任务功能导致的任意文件下载漏洞。 2. 漏洞分析 2.1 定时任务导致的任意文件下载漏洞 漏洞位置 文件路径: com.ruoyi.web.controller.common.resourceDownload 相关配置: application-druid.yml (数据库配置) 关键类: com.ruoyi.common.config.RuoYiConfig 漏洞原理 文件下载机制 : 系统通过 resourceDownload 实现文件下载功能 下载路径由 RuoYiConfig.getProfile() 获取,默认为 D:/ruoyi/uploadPath 下载前会进行白名单校验,但 htm 扩展名也在允许列表中 关键代码分析 : 定时任务功能 : 系统定时任务可以直接调用Bean的对应方法 RuoYiConfig 类与 application.yml 关联,其中 profile 设置了文件下载路径 攻击者可以通过定时任务的set方法修改下载路径配置 利用条件 需要具备定时任务配置权限 需要了解系统默认配置路径 影响范围 若依CMS 4.7.6和4.7.7版本 3. 漏洞复现步骤 环境准备 : 部署若依CMS 4.7.6或4.7.7版本 配置 application-druid.yml 中的数据库信息 利用定时任务修改配置 : 通过定时任务接口调用 RuoYiConfig 的set方法 修改 profile 配置指向敏感文件路径 触发文件下载 : 访问 resourceDownload 接口 通过构造特定参数绕过白名单检查 下载系统任意文件 4. 修复建议 代码层面修复 : 严格限制文件下载的白名单,移除 htm 等非必要扩展名 对下载路径进行更严格的校验 限制定时任务可调用的方法范围 配置层面修复 : 限制 profile 配置的修改权限 设置更安全的默认下载路径 版本升级 : 升级到最新版本,官方可能已修复此漏洞 5. 深入分析 5.1 白名单绕过机制 当前白名单检查存在缺陷,允许 htm 扩展名 攻击者可利用此特性构造特殊文件名绕过检查 5.2 配置注入风险 RuoYiConfig 类与配置文件直接关联 通过反射或定时任务可间接修改关键配置 缺乏配置修改的权限控制和审计日志 6. 防御措施 输入验证 : 实现更严格的文件路径和名称验证 使用正则表达式确保只允许安全字符 权限控制 : 对文件下载功能增加权限检查 限制定时任务的功能范围 日志审计 : 记录所有文件下载操作 监控配置文件的修改行为 7. 总结 若依CMS 4.7.x版本的任意文件下载漏洞主要源于: 不完善的白名单检查机制 定时任务功能过于强大且缺乏限制 配置文件可被间接修改且缺乏保护 通过综合分析系统架构和代码实现,可以更全面地理解此类漏洞的产生原因和利用方式,从而制定更有效的防御策略。