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远程方法协议
- java chains 中开启 JRMP listener
- 选择 JRMP 利用链
- shiroPayload 中选择JRMPClient,生成payload
- 攻击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

浙公网安备 33010602011771号