freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

JAVA反序列化学习--shiro反序列化详解
芝士土拨鼠 2023-09-27 14:21:29 102746

最近参加了某攻防活动,也是遇到了很多的shiro反序列化,上手后也是直接拿起工具就用,原理也仅仅是了解,菜鸟对于shiro也是有太多不了解的,接下来就详细分析一下shiro反序列化产生的原理。

shiro分类

在shiro版本小于1.2.5时,被称作shiro-550,shiro反序列化的产生原因主要是因为rememberMe内容,原因是AES密钥被硬编码在shiro源码中,导致在cookie中的rememberMe可以被插入恶意代码造成代码执行。在1.2.5之后,shiro使用了随机密钥,又因为padding oracle attack导致反序列化,被称作shiro-721。

详细分析

一.shiro环境搭建:

1.下载shiro1.2.4:
https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4
2.IDEA打开shiro,修改shiro/samples/web/pom.xml路径下jstl的依赖版本为1.2,没有就自己加一个
image.png
3.启动IDEA内置tomcat服务
image.png

加密分析

点击log in看到登录界面,开始一步一步分析。在AbstractShiroFilter.class下断点,大概在151行的位置,登录时会断在这里,
image.png
在第157行会创建subject,使用cookie,后续再分析。
image.png
步入executeChain
image.png
可以跟着来到AuthenticatingFilter.class,这里是在进行处理登录
image.png
再往下看,登录成功后触发this.onLoginSuccess
image.png
一直来到DefaultSecuirtyManager.class,找到rememberMeSuccessfulLogin函数
image.png
看到RememberMeManager不为空后,继续走到达AbstractRememberMeManager.java
image.png
跟进forgetIdentity,来到CookieRememberMeManager.class
image.png
继续步入this.forgetIdentity,再单步步入this.getCookie().removeFrom(request, response)
image.png
可以看到rememberMe和deleteMe字段,并且通过addCookieHeader写入cookie中,返回AbstractRememberMeManager.class,this.isRememberMe(token)检查是否选中登陆时Remember Me选项,接着单步步入rememberIdentity
image.png
image.png
convertPrincipalsToBytes是转化成bytes,就在这里还进行了serialize序列化,然后判断不为空后进入this.encrypt,单步步入encrypt函数,密码服务为AES/CBC/PKCS5Paddingimage.png
image.png
接着进入this.getEncryptionCipherKey(),单步步入,发现CipherKey就是AbstractRememberMeManager.class开头的DEFAULT_CIPHER_KEY_BYTES=”kPH+bIxk5D2deZiIxcaaaA==”
image.png
获取了CipherKey返回后进入cipherService.encrypt函数中,生成初始化向量ivBytes后,进入具体的加密函数,最后return。
image.png
一步步return bytes后,回到rememberIdentity函数,下面的rememberSerializedIdentity实现了记住序列化身份的功能,跟进
image.png
在这里进行base64后,将信息加入到cookie中
image.png
然后一直返回,到AuthenticatingFilter#executeLogin处理登录,返回成功登陆
image.png

解密分析

在AbstractShiroFilter.class#doFilterInternal下断点,单步到DefaultSecurityManager#createSubject
image.png
进入resolvePrincipals,单步到getRememberedIdentity,RememberMeManager获取后进入rmm.getRememberedPrincipals(subjectContext)image.png
image.png
第一个函数getRememberedSerializedIdentity,可以看到先获取cookie中的值,然后base64解密,生成二进制数后返回
image.png
第二个函数convertBytesToPrincipals,先获取解密服务,解密服务不为空后,将二进制数据传入decrypt函数进行解密,之后return this.deserialize(bytes)
image.png
在deserialize(bytes)中有readObject(),触发apache.commons利用链漏洞
image.png

结论

整个过程就是
• 读取cookie中rememberMe值

• base64解码

• AES解密

• 反序列化
只要获取到密钥,就可以进行反序列化操作,在1.2.5之后,shiro采取了随机密钥,虽然阻止了shiro550的利用方式。但由于padding oracle attack也导致了反序列化。

# web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 芝士土拨鼠 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
芝士土拨鼠 LV.7
奉天安全团队 技术交流tuboshusec
  • 78 文章数
  • 101 关注者
APP攻防&Android逆向&HOOK抓包&组件安全
2024-02-23
漏洞复现--Confluence远程代码执行漏洞(CVE-2023-22527)
2024-01-23
漏洞复现--Likeshop任意文件上传(CVE-2024-0352)
2024-01-16
文章目录