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 开发环境配置

  1. 使用IDEA打开工程
  2. 等待自动加载三方JAR包
  3. 变更Server端口以避免冲突
  4. 启动PHPStudy并新建数据库RY
  5. 导入数据库文件
  6. 修改配置文件application-druid.yml
  7. 运行RuoYIApplication启动项目

3. 代码审计过程

3.1 漏洞定位

全局搜索关键字"download",定位到关键代码部分。

3.2 第一处下载点分析

路径:/common/download

安全校验:

  1. filename进行校验检查
  2. 使用近似白名单的正则匹配:
    • 允许字符:字母、数字、下划线、破折号、竖线、点和汉字字符
    • 禁止字符:/(无法进行目录穿越)

处理流程:

  1. 创建新文件名:当前时间戳 + 原文件名(去掉前缀_后的部分)
  2. 设置下载文件路径(application.yaml中的profile + /download
  3. 设置响应包的ContentType和头部信息
  4. 写文件并进行Delete删除操作

利用限制:

  • 仅能下载指定目录下的文件
  • 无法进行目录穿越
  • 文件下载后会被删除

3.3 第二处下载点分析

路径:/common/download/resource

处理流程:

  1. 获取localPath(配置文件中的profile
  2. 使用StringUtils.substringAfter截取/profile后面的路径信息
  3. 与前面的localPath拼接作为downloadPath
  4. 获取下载的文件名
  5. 设置响应报文的ContentType
  6. 写数据流到响应报文

安全问题:

  • 未对路径进行校验检查
  • 未过滤../等路径遍历字符
  • 可导致任意文件下载/读取

3.4 漏洞利用

构造漏洞利用载荷实现任意文件读取。

4. 修复方案(Ruoyi CMS 4.5.1版本)

4.1 主要修复措施

  1. 增加checkAllowDownload方法对资源文件进行合法性检查
  2. 建立文件下载白名单规则

4.2 修复优点

  1. 对下载文件路径进行检查
  2. 只允许下载白名单规则内的文件

5. 关键安全启示

  1. 输入验证:所有用户输入都应进行严格验证
  2. 路径处理:文件路径操作应规范化并检查路径遍历
  3. 白名单机制:比黑名单更安全,应优先考虑
  4. 最小权限原则:限制可访问的文件范围
  5. 安全审计:定期进行代码审计,特别是文件操作相关功能

6. 防御措施建议

  1. 实现严格的路径校验函数
  2. 使用规范化路径处理
  3. 建立文件访问白名单
  4. 对敏感文件操作进行日志记录
  5. 定期更新框架和依赖库
  6. 进行安全编码培训

7. 总结

通过分析若依系统中的文件下载功能漏洞,我们可以学习到:

  • 文件操作功能的安全风险点
  • 输入验证的重要性
  • 白名单机制的有效性
  • 安全编码的最佳实践

这些经验教训可以应用于其他Java Web应用的安全开发和审计工作中。

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应用的安全开发和审计工作中。