zoukankan      html  css  js  c++  java
  • 高版本shiro仍存在反序列化漏洞(CVE-2016-4437)

    1、漏洞复现

    一次内部测试发现某内网应用引用的shiro版本已是1.7.1,仍存在反序列化漏洞。
    于是使用shiro反序列化工具验证,确实存在反序列化漏洞,通过猜解出shiro key(即RememberMe cookie AES加密的密钥),构造恶意payload反弹shell获取服务器权限。

    2、漏洞成因

    该漏洞是shiro 1.2.4版本存在的漏洞,深入学习了一下该漏洞细节,该漏洞是由于默认情况下shiro使用CookieRememberMeManager,RememberMe cookie反序列化过程如下:

    • 检索RememberMe cookie的值
    • Base 64解码
    • 使用AES解密
    • 使用Java序列化(ObjectInputStream)反序列化

    通过上面的反序列化过程可知,攻击者需要构造payload(恶意代码)则需要知道AES密钥对payload进行序列化,然后将其作为cookie发送。Shiro将恶意cookie解码并反序列化后执行恶意代码。
    该漏洞的关键点是攻击者如何获取AES密钥,由于1.2.4版本及之前版本的AES密钥是硬编码在代码里的,1.2.4及之前版本的shiro可以通过GitHub开源的shiro代码获取AES密钥。(1.2.4版本后其实没有从本质上解决反序列化漏洞,相当于采取了随机AES密钥无法猜解的缓解措施)
    1.2.5版本以后shiro提供了AES密钥的随机生成代码,但是如果仅进行shiro的版本升级,AES密钥仍硬编码在代码中,仍然会存在反序列化风险(特别是开源的项目,AES密钥通过公共代码仓库就能获取的)

     

    3、排查思路

    1、代码中遍历shiro AES key字典。

    2、代码中搜索setCipherKey关键字,查看AES key是否硬编码。

    4、总结与思考

    通过上述分析,后续研发使用shiro框架务必注意:
    1、使用最新版本的shiro框架。
    2、随机生成RememberMe cookie AES加密的密钥。
    3、可采用JWT token的方式进行身份校验,还能减少缓存。

    随机生成RememberMe cookie AES加密的密钥参考链接及代码:https://blog.csdn.net/qq_34775355/article/details/106643678

    随机生成密钥
    public class GenerateCipherKey {
      
        /**
         * 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int)
         * @return
         */
        public static byte[] generateNewKey() {
            KeyGenerator kg;
            try {
                kg = KeyGenerator.getInstance("AES");
            } catch (NoSuchAlgorithmException var5) {
                String msg = "Unable to acquire AES algorithm.  This is required to function.";
                throw new IllegalStateException(msg, var5);
            }
      
            kg.init(128);
            SecretKey key = kg.generateKey();
            byte[] encoded = key.getEncoded();
            return encoded;
        }
    }

    rememberMeManager()

    @Bean
    public CookieRememberMeManager rememberMeManager() {
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeManager());
        cookieRememberMeManager.setCipherKey(GenerateCipherKey.generateNewKey());
        return cookieRememberMeManager;
    }

  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/Vinson404/p/14767830.html
Copyright © 2011-2022 走看看