【JavaWeb】CVE-2016-4437Shiro反序列化漏洞分析及代码审计
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;
cve漏洞库2.对 root 的序列化值 A 进⾏ AES 加密(密钥为硬编码的常量),得到值 B;
3.base64 编码上述计算的结果 B,得到值 C;
4.将值 C 设置到 response 响应包中 cookie 的 rememberme 字段。
继续分析验证功能
在DefaultSecurityManager.class#getRememberedIdentity下断
分析过后就是上述的逆过程
所以,我们只要知道aes密钥就可以伪造rememberMe的值,从⽽达成反序列化。⽽Apache Shiro < 1.2.4,aes密钥是被硬编码的,所以相当于所有的条件都满⾜了,开始⼲。
漏洞利⽤
直接⽤shiro_exploit2.0⼀把梭
漏洞修复
升级 shiro 到最新版本,不采⽤硬编码的⽅式
如果在配置⾥配置了密钥,那么请⼀定不要使⽤⽹上的密钥,⼀定不要!请⾃⼰base64⼀个AES的密钥,或者利⽤官⽅提供的⽅法⽣成密钥:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。