ApacheShiroRememberMe1.2.4反序列化过程命令执⾏漏洞【原理扫描】⽂章⽬录
⼀、分析定位
1. 漏洞描述
⽬前⼚商已经发布了新版本修复这个安全问题,请到⼚商的主页下载:
/jira/browse/SHIRO-550
/download.html
2. 项⽬引发漏洞简述
若依/Guns管理系统使⽤了Apache Shiro,Shiro 提供了记住我(RememberMe)的功能,下次访问时⽆需再登录即可访问。系统将密钥硬编码在代码⾥,且在官⽅⽂档中并没有强调修改该密钥,导致框架使⽤者⼤多数都使⽤了默认密钥。攻击者可以构造⼀个恶意的对象,并且对其序列化、AES加密、b
ase64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进⾏解密并且反序列化,最终造成反序列化漏洞,进⽽在⽬标机器上执⾏任意命令。
检测漏洞:ShiroConfig.java 是否包含 fCq+/xW488hMTCD+cmJ3aQ==,如果是使⽤的默认密钥则需要修改,防⽌被执⾏命令攻击。⼆、若依系统
2.1. 版本升级
升级版本到 >=v.4.3.1(其实就是升级Shiro版本到1.7),并且重新⽣成⼀个新的秘钥替换cipherKey,保证唯⼀且不要泄漏。
若依官⽹做法:
# Shiro
shiro:
cookie:
# 设置密钥,务必保持唯⼀性(⽣成⽅式,直接拷贝到main运⾏即可)KeyGenerator keygen = KeyG
cipherKey: zSyK5Kp6PZAAjlT+eeNMlg==
2.3. 推荐做法
调⽤的⽅法随机⽣成最好,不然安全扫描还会有漏洞
2.4. 栗⼦
package com.gblfy.util;
import org.dec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
pto.KeyGenerator;
pto.SecretKey;
import java.security.NoSuchAlgorithmException;
/**
* ⽣成⼀个Base64唯⼀字符串
*
* @author guobin
* @date 2020-12-06
*/
public class ShiroAESEncryption {
private final static Logger logger = Logger(ShiroAESEncryption.class);
public static void main(String[] args) throws NoSuchAlgorithmException{
// 直接拷贝到main运⾏即可⽣成⼀个Base64唯⼀字符串
KeyGenerator keygen = Instance("AES");
SecretKey deskey = ateKey();
logger.info("⽣成新的Base64唯⼀字符串秘钥: {}", Encoded()));
}
}
2.5. 项⽬场景
在具体代码调⽤此⽅法⽣成唯⼀的base64码值
3.1. shiro版本升级
升级Shiro版本到 >=1.7,在调⽤的地⽅重新⽣成⼀个新的秘钥替换ConstDb.CIPHERKEY Base64.decode(ConstDb.CIPHERKEY),保证唯⼀且不要泄漏。
<properties>
<!--全局编码设置-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
&porting.outputEncoding>UTF-8</porting.outputEncoding>
<!--全局版本统⼀设置-->
<shiro.version>1.7.0</shiro.version>
</properties>
<!--shiro依赖和缓存-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache2.version}</version>
</dependency>
3.2. 调⽤重新⽣成
/**
* rememberMe管理器, cipherKey⽣成见{@code Base64Test.java}
*/
@Bean
public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie){        CookieRememberMeManager manager = new CookieRememberMeManager();
String aesEncryption = ShiroAESEncryption.ShiroAESEncryption();
manager.setCipherKey(Base64.decode(aesEncryption));
manager.setCookie(rememberMeCookie);
return manager;
}
3.3. ⽣成⼯具类
package com.gblfy.util;
import org.dec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
pto.KeyGenerator;
pto.SecretKey;
import java.security.NoSuchAlgorithmException;
/**
* ⽣成⼀个Base64唯⼀字符串
*
* @author guobin
* @date 2020-12-06
*/
public class ShiroAESEncryption {
private final static Logger logger = Logger(ShiroAESEncryption.class);
public static void ShiroAESEncryption(){
KeyGenerator keygen = null;
try {
keygen = Instance("AES");
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
SecretKey deskey = ateKey();
logger.info("⽣成新的Base64唯⼀字符串秘钥: {}", Encoded())); }
public static void main(String[] args){
ShiroAESEncryption();
下载apache
}
}
shiro漏洞补充:
1.4
1.4.2
1.6
都存在漏洞建议升级到shiro1.7版本

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。