学生会私房菜
学生会私房菜是通过学生会信箱收集同学们的来稿,挑选其中的优质文档,不定期进行文档推送的主题。
本期文档内容为:《Apache Shiro 1.2.4反序列化漏洞》
![7f23201647d2f73fcf3a45fec9ed23b4.png](https://i-blog.csdnimg.cn/blog_migrate/1e58b3d5f253bf2178b0c8b6d43d5f05.png)
一名来自网络工程专业的安全爱好者,目前在国科学习安全课程,同时也在国科安全团体进行安全的实战练习,本次分享的内容是CVE-2016-4437的漏洞,希望可以帮助大家更好理解这个漏洞。
0x00简介
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
Shiro的“记住我”功能是设置cookie中的rememberMe值来实现。当后端收到来自未经身份验证的用户的请求时,它将通过以下操作来寻找他们记住的身份:
检索cookie中的rememberMe的值
Base64解码
使用AES解密
反序列化
漏洞的原因在于第三步,AES的密钥是硬编码的,导致攻击者可以构造rememberMe的值,触发Java反序列化,进而在目标上执行任意命令。
0x01影响范围
Apache Shiro <= 1.2.4
0x02漏洞分析
(PS.此处对Java代码不是很熟悉,参考了网上分析)
从官方issue上来看,存在几个重要的点:
1.rememberMe cookie
2.Base 64 decode
3.Decrypt using AES
4.Java serialization
加密过程:
首先调用forgetIdentity构造方法处理request和response请求,包括在response中加入cookie信息,然后调用rememberIdentity函数,来处理cookie中的rememberme字段。跟进rememberIdentity函数:
rememberIdentity函数首先调用getIdentityToRemember函数来获取用户身份,接着跟进rememberIdentity构造方法:
调用convertPrincipalsToBytes方法将accountPrincipals转换为字节形式。跟进此函数
转换过程是先序列化用户身份"id",在对其进行encrypt,跟进encrypt函数:
encrypt函数就是调用AES加密对序列化后的"id"进行加密,加密的密钥由getEncryptionCipherKe