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;
    }

  • 相关阅读:
    Java集合框架:Collections工具类
    百度编辑器多图上传返回图片绝对路径问题
    iOS开发中“此证书的签发者无效”的解决方式
    codeblocks如何watch指针
    codeblocks如何watch数组
    printf不支持%lf
    doxygen可以生成C/C++代码的文档(根据注释)
    codeblocks中右键源文件没有Rename选项?
    codeblocks中给GCC编译器加参数
    codeblocks设置当前行高亮
  • 原文地址:https://www.cnblogs.com/Vinson404/p/14767830.html
Copyright © 2011-2022 走看看