Apache Shiro RememberMe 1.2.4 反序列化过程命令执行漏洞【原理扫描】

文章目录

          • 一、分析定位
            • 1. 漏洞描述
            • 2. 项目引发漏洞简述
          • 二、 若依系统
            • 2.1. 版本升级
            • 2.2. 配置文件
            • 2.3. 推荐做法
            • 2.4. 栗子
            • 2.5. 项目场景
          • 三、Gus系统
            • 3.1. shiro版本升级
            • 3.2. 调用重新生成
            • 3.3. 生成工具类
            • shiro漏洞补充:

一、分析定位
1. 漏洞描述

在这里插入图片描述
在这里插入图片描述

目前厂商已经发布了新版本修复这个安全问题,请到厂商的主页下载: https://issues.apache.org/jira/browse/SHIRO-550 
https://shiro.apache.org/download.html 
2. 项目引发漏洞简述

若依/Guns管理系统使用了Apache Shiro,Shiro 提供了记住我(RememberMe)的功能,下次访问时无需再登录即可访问。系统将密钥硬编码在代码里,且在官方文档中并没有强调修改该密钥,导致框架使用者大多数都使用了默认密钥。攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞,进而在目标机器上执行任意命令。

检测漏洞:ShiroConfig.java 是否包含 fCq+/xW488hMTCD+cmJ3aQ==,如果是使用的默认密钥则需要修改,防止被执行命令攻击。

二、 若依系统
2.1. 版本升级

升级版本到 >=v.4.3.1(其实就是升级Shiro版本到1.7),并且重新生成一个新的秘钥替换cipherKey,保证唯一且不要泄漏。

2.2. 配置文件

若依官网做法:

# Shiro
shiro:cookie:# 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecretKey deskey = keygen.generateKey(); System.out.println(Base64.encodeToString(deskey.getEncoded()));cipherKey: zSyK5Kp6PZAAjlT+eeNMlg==
2.3. 推荐做法

调用的方法随机生成最好,不然安全扫描还会有漏洞

2.4. 栗子
package com.gblfy.util;import org.apache.shiro.codec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;/*** 生成一个Base64唯一字符串** @author guobin* @date 2020-12-06*/
public class ShiroAESEncryption {private final static Logger logger = LoggerFactory.getLogger(ShiroAESEncryption.class);public static void main(String[] args) throws NoSuchAlgorithmException{// 直接拷贝到main运行即可生成一个Base64唯一字符串KeyGenerator keygen = KeyGenerator.getInstance("AES");SecretKey deskey = keygen.generateKey();logger.info("生成新的Base64唯一字符串秘钥: {}", Base64.encodeToString(deskey.getEncoded()));}
}

在这里插入图片描述

2.5. 项目场景

在具体代码调用此方法生成唯一的base64码值

三、Gus系统
3.1. shiro版本升级

升级Shiro版本到 >=1.7,在调用的地方重新生成一个新的秘钥替换ConstDb.CIPHERKEY Base64.decode(ConstDb.CIPHERKEY),保证唯一且不要泄漏。

    <properties><!--全局编码设置--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.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}*/@Beanpublic 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.apache.shiro.codec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;/*** 生成一个Base64唯一字符串** @author guobin* @date 2020-12-06*/
public class ShiroAESEncryption {private final static Logger logger = LoggerFactory.getLogger(ShiroAESEncryption.class);public static void ShiroAESEncryption() {KeyGenerator keygen = null;try {keygen = KeyGenerator.getInstance("AES");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}SecretKey deskey = keygen.generateKey();logger.info("生成新的Base64唯一字符串秘钥: {}", Base64.encodeToString(deskey.getEncoded()));}public static void main(String[] args) {ShiroAESEncryption();}
}
shiro漏洞补充:

1.4
1.4.2
1.6
都存在漏洞建议升级到shiro1.7版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统json文件打中文,如何在 Linux 终端上漂亮地打印 JSON 文件

JSON 文件非常棒&#xff0c;因为它们以人类可读的格式存储数据集合。然而&#xff0c;如果 JSON 文件被最小化过&#xff0c;那么阅读 JSON 文件可能会很痛苦。• 来源&#xff1a;linux.cn • 作者&#xff1a;Abhishek Prakash • 译者&#xff1a;geekpi •(本文字数&#…

超级干货!31 条2020 年最新版 ZooKeeper面试题,先收藏再看!| 博文精选

作者| ThinkWon责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;金三银四&#xff0c;虽然受疫情影响&#xff0c;大多数企业还未正式复工&#xff0c;但没有条件&#xff0c;创造条件也要上&#xff0c;许多企业已经开始物色合适的人才了&#…

Node.js 应用故障排查手册 —— 雪崩型内存泄漏问题

楔子 实践篇一中我们也看到了一个比较典型的由于开发者不当使用第三方库&#xff0c;而且在配置信息中携带了三方库本身使用不到的信息&#xff0c;导致了内存泄漏的案例&#xff0c;实际上类似这种相对缓慢的 Node.js 应用内存泄漏问题我们总是可以在合适的机会抓取堆快照进行…

检测到远端X服务正在运行中

文章目录一、 漏洞详情二、 解决方案2.1. 方案1(推荐使用)2.2. 方案2一、 漏洞详情 二、 解决方案 2.1. 方案1(推荐使用) 既然漏洞是6000端口导致的&#xff0c;首先要分析linux6000端口是谁在用呢、又和什么程序有关&#xff1f;如果没有用直接关掉6000端口即可&#xff0c;…

Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

排查完全陌生的问题&#xff0c;完全不熟悉的系统组件&#xff0c;是售后工程师的一大工作乐趣&#xff0c;当然也是挑战。今天借这篇文章&#xff0c;跟大家分析一例这样的问题。排查过程中&#xff0c;需要理解一些自己完全陌生的组件&#xff0c;比如systemd和dbus。但是排查…

面试还搞不懂Redis,快看看这40道面试题!| 博文精选

作者| 程序员追风责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;近年来&#xff0c;微服务变得越来越热门&#xff0c;越来越多的应用部署在分布式环境中。常用的分布式实现方式之一就有 Redis。对于想要年后换东家的程序员来说&#xff0c;如…

阿里新一代分布式任务调度平台Schedulerx2.0破土而出

1. 产品简介 Schedulerx2.0是阿里中间件自研的基于Akka架构的新一代分布式任务调度平台&#xff0c;提供定时、任务编排、分布式跑批等功能。使用Schedulerx2.0&#xff0c;您可以在控制台配置管理您的定时任务&#xff0c;查询历史执行记录&#xff0c;查看运行日志。借助Sch…

阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?

轻松筹首创了“大病救助”模式&#xff0c;帮助了众多病患在第一时间解決了医疗资金等问题&#xff0c;为了从源头解决了医疗资金问题。而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后&#xff0c;是日益增长的各种数据。面对这样数据量所造成的巨大挑战&#xff0c;阿里…

彻彻底底给你讲明白啥是SpringMvc异步处理

来源 | 编程新说责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;生活在这个世界上&#xff0c;我们必须承认任何事物都是运动变化着的&#xff0c;没有什么东西是一成不变的。不仅因为这句话是出自马克思主义哲学的唯物辩证法&#xff0c;而且事…

选择阿里云数据库HBase版十大理由

根据Gartner的预计&#xff0c;全球非关系型数据库&#xff08;NoSQL&#xff09;在2020~2022预计保持在30%左右高速增长&#xff0c;远高于数据库整体市场。 阿里云数据库HBase版也是踏着技术发展的节奏&#xff0c;伴随着NoSQL和大数据技术的兴起和发展&#xff0c;从2010年…

酷睿i7cpu适合的linux,CPU性能篇 - Core i7-4770K Linux之旅:有喜有忧_Linux新闻_Linux公社-Linux系统门户网站...

CPU性能篇——Rodinia是学术界经常使用的科学测试工具。OpenMP LavaMD负载中&#xff0c;4770K相比3770K快了12&#xff05;&#xff0c;8350表现也可以。OpenMP Leukocyte负载里&#xff0c;4770K对比3770K的优势依然有10&#xff05;&#xff0c;但是8350大亮了&#xff0c;竟…

GitOps:Kubernetes多集群环境下的高效CICD实践

为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题&#xff0c;云原生这一概念横空出世。云原生可以改进应用开发的效率&#xff0c;改变企业的组织结构&#xff0c;甚至会在文化层面上直接影响一个公司的决策&#xff0c;可以说&a…

远程办公是一阵“过渡风”还是会“继续燃烧”?

受中国新型冠状病毒肺炎感疫情的影响&#xff0c;2月伊始&#xff0c;「远程办公」成为所有人关心与讨论的热门话题之一。在现实驱动之下&#xff0c;企业如何协同与高效办公成为重点问题中的焦点。在中国企业与「远程办公」正面相遇满月之际&#xff0c;2月29日&#xff0c;CS…

SpringBoot+Shiro+ehcache实现登录失败超次数锁定帐号

文章目录二、Controller层接收登录请求三、自定义的Realm四、密码验证器增加登录次数校验功能五、ShiroConfig的配置类六、EhCache 的配置七、全局异常的配置####### 一、 Shiro的执行流程1、核心介绍1&#xff09;Application Code用户编写代码2&#xff09;Subject就是shiro管…

linux putty 字体,putty修改字体配色

先看效果步骤&#xff1a;1. 打开Windows注册表编辑器开始 -> regedit2. 找到putty默认session所在位置HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Default%20Settings3. 右键导出修改# 字体(monaco字体不错&#xff0c;如效果图)"Font""Consol…

90后ACE成长记——从偏居一隅小城里走出的核心技术人

《ACE成长记》栏目说明 名词解释&#xff1a; 阿里云工程师&#xff0c;简称 ACE &#xff08;Alibaba Cloud Engineer&#xff09;&#xff0c;代表云计算的爱好者&#xff0c;是最“王牌”&#xff08;ACE&#xff09;的一群开发者&#xff0c;也是未来的MVP。 ACE 是遍布在…

阿里开发者招聘节 | 面试题01:如何实现一个高效的单向链表逆序输出?

面试&#xff0c;如同玩一场饥饿游戏&#xff1a;既要对环境了然于胸&#xff0c;又要对自身心知肚明。发现一个好工作不容易&#xff0c;但成功应聘又会面临一系列的挑战。 为帮助开发者们提升面试技能、有机会入职阿里&#xff0c;云栖社区特别制作了这个专辑——阿里巴巴资…

从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!

作者| Alexey Ledenev翻译 | 天道酬勤&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;随着企业与各种云提供商合作&#xff0c;多云场景已经变得十分常见。在谷歌Kubernetes引擎&#xff08;GKE&#xff09;上运行的应用程序需要访…

MSSQL-最佳实践-Always Encrypted

摘要 在SQL Server安全系列专题月报分享中&#xff0c;往期我们已经陆续分享了&#xff1a;如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案、行级别安…

java实现对文件加解密操作

源文件&#xff1a; 加密后的文件&#xff1a; 解密后的文件&#xff1a; package com.gblfy.test;import java.io.*;/*** java 实现对文件加解密的方法** author gblfy* date 2020-12-08*/ public class IOSercet {//获取系统类型private static String OS System.getPro…