apache shiro 反序列化漏洞解决方案

apache shiro 反序列化漏洞解决方案

  • 反序列化漏洞解决方案
    • 产生原因
    • 解决方案1:1.升级shiro至最新版本1.7.1
    • 解决方案2:修改rememberMe默认密钥,生成随机密钥。

反序列化漏洞解决方案

反序列化漏洞介绍
序列化:把对象转换为字符串或者字节流的过程。
反序列化:把字符串或者字节流恢复为对象的过程。
反序列化漏洞的产生原理,即黑客通过构造恶意的序列化数据,从而控制应用在反序列化过程中需要调用的类方法,最终实现任意方法调用。如果在这些方法中有命令执行的方法,黑客就可以在服务器上执行任意的命令。

解决方案:
1.升级shiro至最新版本1.7.1
2.保持shiro版本不变<=1.2.4,修改rememberMe默认密钥
3.禁用rememberMe功能(不使用此方法)
apache shiro 反序列化漏洞解决方案_第1张图片

产生原因

shiro提供了记住我(RememberMe)的功能,即可以在关闭浏览器的情况下,下次打开时还能记住你是谁,无需登录即可访问。
shiro默认使用了CookieRememberMeManager来管理RememberMe cookie, 其处理cookie的流程是:
1:生成cookie:序列化 => 使用密钥进行AES加密 => Base64编码,最后返回客户端 remebreme Cookie;
2: 识别cookie:得到rememberMe的cookie值=>Base64解码=>使用密钥进行AES解密=>反序列化。
这个通过观察shiro1.2.4版本的源代码可以发现,如果不指定密钥,shiro会默认一个初始化密钥,该密钥是被硬编码在代码中,由于代码是开源的,攻击者很容易找到该密钥,并且伪造cookie发起攻击。
总结:漏洞产生的根本原因是密钥泄露,比如使用网上公开的密钥,也会存在这个问题。

解决方案1:1.升级shiro至最新版本1.7.1

        
            org.apache.shiro
            shiro-spring
            1.7.1
        

密钥硬编码问题存在于1.2.4版本及以下。通过观察最新版本1.7.1的源代码发现,如果不指定密钥shiro会初始化一个随机密钥,由于密钥是随机生成的,所以攻击者没办法猜测到密钥。
注意 这是在使用shiro默认密钥的情况下,如果应用修改了默认密钥则需要保证该密钥不是公开的,并妥善保管防止泄露。
单纯升级shiro没能达到要求,还需要解决解决方案2来生成随机密钥。

解决方案2:修改rememberMe默认密钥,生成随机密钥。

springboot:随机密钥生成工具类:

import org.apache.shiro.crypto.AesCipherService;
 
import java.security.Key;
 
public class ShiroCustomAESKeyUtil {
    public static String getKey(){
        AesCipherService aesCipherService = new AesCipherService();
        Key key = aesCipherService.generateNewKey();
        return java.util.Base64.getEncoder().encodeToString(key.getEncoded());
    }
}

将默认密钥调用改为调用随机密钥:

    /**
     * 记住我
     */
    public CookieRememberMeManager rememberMeManager()
    {
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
//        cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
        //密钥 调用ShiroCustomAESKeyUtil.getKey()生成
        String cipherKey= ShiroCustomAESKeyUtil.getKey();
        cookieRememberMeManager.setCipherKey(org.apache.shiro.codec.Base64
                .decode(cipherKey));
        return cookieRememberMeManager;
    }

重点将密钥修改为随机生成:
apache shiro 反序列化漏洞解决方案_第2张图片
总结:
综合考虑建议采用升级shiro版本(方案1)+修改密钥(方案2)的方式。该方式解决默认密钥硬编码的问题,同时也防止重启后密钥改变导致重启前的remeberme cookie失效的问题。

参考链接:
https://blog.csdn.net/qq_36407469/article/details/119119875

你可能感兴趣的:(JAVA,java,漏洞解决)