JAVA代码审计之从若依任意文件读取学防护
字数 1406 2025-09-01 11:26:17
JAVA代码审计之从若依任意文件读取学防护
1. 若依(RuoYi)系统简介
若依(RuoYi)是一个基于以下技术构建的后台管理系统:
- Spring Boot
- Apache Shiro
- MyBatis
- Thymeleaf
主要目的是让开发者专注于业务逻辑,降低技术难度,从而:
- 节省人力成本
- 缩短项目周期
- 提高软件安全质量
2. 环境搭建
2.1 获取源码
源码地址:https://github.com/yangzongzhuan/RuoYi
2.2 开发环境配置
- 使用IDEA打开工程
- 等待自动加载三方JAR包
- 变更Server端口以避免冲突
- 启动PHPStudy并新建数据库RY
- 导入数据库文件
- 修改配置文件
application-druid.yml - 运行
RuoYIApplication启动项目
3. 代码审计过程
3.1 漏洞定位
全局搜索关键字"download",定位到关键代码部分。
3.2 第一处下载点分析
路径:/common/download
安全校验:
- 对
filename进行校验检查 - 使用近似白名单的正则匹配:
- 允许字符:字母、数字、下划线、破折号、竖线、点和汉字字符
- 禁止字符:
/(无法进行目录穿越)
处理流程:
- 创建新文件名:当前时间戳 + 原文件名(去掉前缀
_后的部分) - 设置下载文件路径(
application.yaml中的profile+/download) - 设置响应包的
ContentType和头部信息 - 写文件并进行
Delete删除操作
利用限制:
- 仅能下载指定目录下的文件
- 无法进行目录穿越
- 文件下载后会被删除
3.3 第二处下载点分析
路径:/common/download/resource
处理流程:
- 获取
localPath(配置文件中的profile) - 使用
StringUtils.substringAfter截取/profile后面的路径信息 - 与前面的
localPath拼接作为downloadPath - 获取下载的文件名
- 设置响应报文的
ContentType - 写数据流到响应报文
安全问题:
- 未对路径进行校验检查
- 未过滤
../等路径遍历字符 - 可导致任意文件下载/读取
3.4 漏洞利用
构造漏洞利用载荷实现任意文件读取。
4. 修复方案(Ruoyi CMS 4.5.1版本)
4.1 主要修复措施
- 增加
checkAllowDownload方法对资源文件进行合法性检查 - 建立文件下载白名单规则
4.2 修复优点
- 对下载文件路径进行检查
- 只允许下载白名单规则内的文件
5. 关键安全启示
- 输入验证:所有用户输入都应进行严格验证
- 路径处理:文件路径操作应规范化并检查路径遍历
- 白名单机制:比黑名单更安全,应优先考虑
- 最小权限原则:限制可访问的文件范围
- 安全审计:定期进行代码审计,特别是文件操作相关功能
6. 防御措施建议
- 实现严格的路径校验函数
- 使用规范化路径处理
- 建立文件访问白名单
- 对敏感文件操作进行日志记录
- 定期更新框架和依赖库
- 进行安全编码培训
7. 总结
通过分析若依系统中的文件下载功能漏洞,我们可以学习到:
- 文件操作功能的安全风险点
- 输入验证的重要性
- 白名单机制的有效性
- 安全编码的最佳实践
这些经验教训可以应用于其他Java Web应用的安全开发和审计工作中。