漏洞分析
Shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer
类中将cookie中rememberMe字段内容分别进行 序列化、AES加密、Base64编码操作。
在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:
获取rememberMe cookie
base64 decode
解密AES
反序列化
但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
Shiro Java反序列化漏洞实例
漏洞验证
首先,使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123;
,看响应包header中是否返回rememberMe=deleteMe
值,若有,则证明该系统使用了Shiro框架。
工具利用
这里选择爆破密钥,密钥会自动出现
然后选择一个合适的利用链
然后就可以命令执行
脚本手工利用
Shiro remeberMe反序列化漏洞(Shiro-550) - 我要变超人 - 博客园
参考这篇文章把,我复现了没截图,就不写了
Java安全之ysoserial-JRMP模块分析(一) - 知乎
中间用到了一个反序列化原理工具是这个