【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中打下断点,开时调试
    image

  • 分析登录流程

    • 登录成功后,判定是设置了rememberMe

    • 开始对验证信息进行梳理

      • 先进行了反序列化
        image
      • 然后进行AES加密
        image
      • 发现密钥是硬编码在代码中的
        image
      • aes加密后,再进行了一次b64编码
        image
      • 将上述的base64字符串通过响应头设置到本地的cookie中
        image
      • 添加set-cookie字段
        image
      • 完成cookie设定,达成rememberMe功能
        image

      整个过程
      1.序列化用户身份"root",得到值 A;
      2.对 root 的序列化值 A 进行 AES 加密(密钥为硬编码的常量),得到值 B;
      3.base64 编码上述计算的结果 B,得到值 C;
      4.将值 C 设置到 response 响应包中 cookie 的 rememberme 字段。

    • 继续分析验证功能

      • 在DefaultSecurityManager.class#getRememberedIdentity下断
        image
      • 分析过后就是上述的逆过程

所以,我们只要知道aes密钥就可以伪造rememberMe的值,从而达成反序列化。而Apache Shiro < 1.2.4,aes密钥是被硬编码的,所以相当于所有的条件都满足了,开始干。

漏洞利用

直接用shiro_exploit2.0一把梭
shiro_exploit2.0

漏洞修复

  1. 升级 shiro 到最新版本,不采用硬编码的方式
  2. 如果在配置里配置了密钥,那么请一定不要使用网上的密钥, 一定不要!请自己base64一个AES的密钥,或者利用官方提供的方法生成密钥:
posted @ 2022-01-18 17:13  Aur0ra*  阅读(271)  评论(0编辑  收藏  举报