java组件漏洞——shiro

shiro

shiro 是 java 安全框架,用于身份的验证、授权、加密等功能

怎么判断网站使用了 shiro

看响应中是否有 rememberMe=deleteMe 的 Set-Cookie头

之后再输入用户名和密码抓包

⚠️ 高版本shiro,rememberMe=deleteMe 可以随便改,导致攻击者无法判断是否是 shiro
解决方法1:直接进行漏洞攻击
解决方法2:信息泄露 (springboot actuator heapdump 里面会泄露修改后的shiro 的名字和密钥)
解决方法3: 代码审计

shiro 的身份验证过程

关键是AES密钥,如果黑客能够获取AES密钥,整个过程便形同虚设

攻击者怎么获取AES密钥呢?

  • 方法1:shiro 1.2.4 版本前,shiro 有默认的密钥 (shiro AES key 硬编码 [硬编码就是指直接把密码写在了代码中]),使用shiro进行写网站的开发者没人改密钥,导致shiro的密钥都是 kPH+bIxk5D2deZiIxcaaaA== (该漏洞被称为 shiro-550 漏洞 及 CVE-2016-4437 漏洞)
  • 方法2:信息泄露 (springboot actuator heapdump 里面会泄露修改后的shiro 的名字和密钥)
  • 方法3:爆破密钥 (密钥字典都是从各级供应链的组件中提取出的)https://github.com/yanm1e/shiro_key

CVE-2016-4437 (shiro-550)

CommonsBeanUtils1

java-chains 生成 cb1 链的 payload

对目标抓包,在 cookie 中添加,发送请求即可完成攻击

rememberMe=刚刚生成的反序列序列化链

之后点击发送,开监听的服务器就能收到了

JRMP

CB1链太长了,怎么缩短链长度? JRMP 反序列化

Java Remote Method Protocol java远程方法协议

  1. java chains 中开启 JRMP listener

  1. 选择 JRMP 利用链

  1. shiroPayload 中选择JRMPClient,生成payload

  1. 攻击shiro 550

就可以收到了

  • 攻击者通过 jrmp client 利用链攻击网站存在的shiro550漏洞,shiro550漏洞,会自动把 jrmp client 利用链反序列化到 jvm 中
  • jvm中 jrmp client 会自动请求 攻击者的 jrmp Listener,攻击者的 jrmp Listener 会把 cb1链发回给 jrmp client
  • jrmp client 本身具有的反序列化功能,会把 cb1 链反序列化到 jvm 中
  • jvm 中 cb1 触发反弹shell

shiro 权限绕过漏洞 (CVE-2020-1957)

  • 比如 网站后台接口 /admin ,需要用户登录后才能访问
  • 攻击者 访问 /xxx/..;/admin/ 接口,即可绕过登录限制,实现未授权访问后台接口

shiro 721

aes cbc 模式 出现的隐患 Padding Oracle Attack

参考文章:
https://www.cnblogs.com/smileleooo/p/18171246

posted @ 2026-09-23 16:15  xiaohe666  阅读(3)  评论(0)    收藏  举报