【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计
Shiro反序列化漏洞分析及代码审计
漏洞简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。
Apache Shiro默认使用了CookieRememberMeManager,用户登录成功后会生成经过加密并编码的cookie,在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
漏洞影响
Apache Shiro < 1.2.4
漏洞分析
这里是直接从github拉下来得,里面有样例,拿样例复现即可
-
先在RememberMeManager.class中打下断点,开时调试
-
分析登录流程
-
登录成功后,判定是设置了rememberMe
-
开始对验证信息进行梳理
- 先进行了反序列化
- 然后进行AES加密
- 发现密钥是硬编码在代码中的
- aes加密后,再进行了一次b64编码
- 将上述的base64字符串通过响应头设置到本地的cookie中
- 添加set-cookie字段
- 完成cookie设定,达成rememberMe功能
整个过程
1.序列化用户身份"root",得到值 A;
2.对 root 的序列化值 A 进行 AES 加密(密钥为硬编码的常量),得到值 B;
3.base64 编码上述计算的结果 B,得到值 C;
4.将值 C 设置到 response 响应包中 cookie 的 rememberme 字段。 - 先进行了反序列化
-
继续分析验证功能
- 在DefaultSecurityManager.class#getRememberedIdentity下断
- 分析过后就是上述的逆过程
- 在DefaultSecurityManager.class#getRememberedIdentity下断
-
所以,我们只要知道aes密钥就可以伪造rememberMe的值,从而达成反序列化。而Apache Shiro < 1.2.4,aes密钥是被硬编码的,所以相当于所有的条件都满足了,开始干。
漏洞利用
直接用shiro_exploit2.0一把梭
shiro_exploit2.0
漏洞修复
- 升级 shiro 到最新版本,不采用硬编码的方式
- 如果在配置里配置了密钥,那么请一定不要使用网上的密钥, 一定不要!请自己base64一个AES的密钥,或者利用官方提供的方法生成密钥: