shiro反序列化原理
rememberMe功能:
shiro框架提供了rememberMe功能,这个功能大概是用户登录成功后会生成一个凭证组,shiro将它经过序列化->AES加密->Base64加密得到一串数据流传回给cookie,下次登录时,shiro通过Base64解码->AES解密->反序列化验证cookie中的rememberMe包含的凭证组是否正确,从而实现“下次登录记住我”的功能。
漏洞原理:
造成shiro反序列化漏洞的关键点,一个是Shiro<1.2.4中,AES-CBC加解密时key默认为硬编码,只要能获取到这个key就可以构造恶意数据让shiro识别为正常数据;另一个点是shiro在验证rememberMe时使用了readObject方法,readObject用来执行反序列化后需要执行的代码片段,从而造成恶意命令可以被执行。
漏洞利用:
- 首先需要获取正确的key值,利用shiro接收错误rememberMe会抛出异常返回Set-Cookie的特性,可以通过爆破,直到响应头中不包含Set-Cookie,说明key成功匹配。
- 接着需要对恶意数据进行序列化,shiro序列化对象只有继承PrincipalCollection时,类型转换才正常,不然会抛出异常,这里可以借助ysoserial生成序列化数据:
利用ysoserial中的JRMP监听模块进行反弹shell,需使用Java Runtime 配合 bash 编码 java -cp - ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 监听端口
CommonsCollections4 ‘bash编码’ 利用ysoserial生成.ser文件 java -jar
ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 “命令” > x.ser - 然后进行AES加密、Base64加密,伪造cookie,执行命令
如何判断一个网站是否使用了shiro框架
在请求包中的cookie字段添加rememberMe=xxx,查看响应头中是否包含rememberMe=deleteMe值
例如:


本文深入探讨了Apache Shiro框架的rememberMe功能及其潜在的安全风险。当Shiro版本低于1.2.4时,由于AES加密key的硬编码以及使用readObject方法进行反序列化,攻击者可能利用此漏洞构造恶意数据,执行任意命令。漏洞利用过程包括获取AES key、序列化恶意数据、AES加密和Base64编码,最后伪造cookie来触发命令执行。判断网站是否使用Shiro的方法是检查响应头中的rememberMe=deleteMe字段。
980

被折叠的 条评论
为什么被折叠?



