若依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
漏洞原理
-
文件下载机制:
- 系统通过
resourceDownload实现文件下载功能 - 下载路径由
RuoYiConfig.getProfile()获取,默认为D:/ruoyi/uploadPath - 下载前会进行白名单校验,但
htm扩展名也在允许列表中
- 系统通过
-
关键代码分析:
// 数据库资源地址 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());
- 定时任务功能:
- 系统定时任务可以直接调用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版本的任意文件下载漏洞主要源于:
- 不完善的白名单检查机制
- 定时任务功能过于强大且缺乏限制
- 配置文件可被间接修改且缺乏保护
通过综合分析系统架构和代码实现,可以更全面地理解此类漏洞的产生原因和利用方式,从而制定更有效的防御策略。