最近工作上刚好碰到了这个漏洞,当时的漏洞扫描出来后一直升级shiro也没效果,最后才发现是,shiro的rememberMe功能的AES密钥一旦泄露,就会导致反序列化漏洞。
而无论是否升级shiro到最新版本还是什么,ShiroConfig类里面的rememberMe管理器如果没有做修改大部分都是一样的代码,所以很容易就会被攻击到。
/**
* rememberMe管理器, cipherKey生成见{@code Base64Test.java}
*/
@Bean
public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
CookieRememberMeManager manager = new CookieRememberMeManager();
manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
manager.setCookie(rememberMeCookie);
return manager;
}
最后自己将key设置成动态的,避免了过于简单而被攻击。
/**
* rememberMe管理器, cipherKey生成见{@code Base64Test.java}
*/
@Bean
public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
CookieRememberMeManager manager = new CookieRememberMeManager();
String md5 = getMD5Str(System.currentTimeMillis()+"");
manager.setCipherKey(Base64.decode(md5));
manager.setCookie(rememberMeCookie);
return manager;
}
public static String getMD5Str(String strValue) {
String newStr ="";
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
newStr = Base64.encodeToString(md5.digest(strValue.getBytes()));
} catch (Exception e) {
return "LzAsTQiJccTVaXNM4DeJqs==";
}
return newStr;
}