Shiro-721 分析

news2024/9/23 19:15:11

前言

shiro-550漏洞的产生源自硬编码问题,在 1.2.4之前,密钥在代码中是固定的在这里插入图片描述
在这里插入图片描述
而在1.2.5 <= Apache Shiro <= 1.4.1,我们再看AbstractRememberMeManager类,已经修改为生成随机的密钥
在这里插入图片描述
在本篇文章中,分析着重于代码方向,至于加密算法和测信道攻击,之前接触的较少。在这方面我处于能理解,但是让我来说,感觉还是很难说明白的阶段,可以多看看其他大佬的文章,交叉印证学习

1.漏洞原理

Shiro-721漏洞的产生源自AES-128-CBC模式,它受CBC字节反转攻击和Padding Oracle Attack(侧信道攻击)的影响,导致可以从一个正常的rememberMe的值基础上,根据Padding Oracle Attack的原理,通过爆破构造出恶意的RememberMe,重新发送到服务器端进行解析并触发反序列化达到RCE的效果

影响版本:Apache Shiro <= 1.4.1

2.环境搭建

  1. jdk8u65
  2. tomcat8 (https://tomcat.apache.org/download-80.cgi?Preferred=https%3A%2F%2Fdlcdn.apache.org%2F)
  3. 整合的shiro-721网站测试项目( https://github.com/jas502n/SHIRO-721/blob/master/samples-web-1.4.1.war)

2.1 项目搭建

下载项目之后,先解压,然后在idea中创建一个web-app 的 maven arch项目,然后项目解压后的拖入到webapp中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加Tomcat并设置部署后直接启动即可
在这里插入图片描述
在这里插入图片描述

3.漏洞分析

3.1 密钥生成过程

具体的shio登录和验证过程分析之前在Shiro550那一篇分析中有详细的,咱们这篇就不详细过了
Shiro-550详细分析
我们进行一次rememberMe登录,并在AbstractRememberMeManager.encrypt方法打下断点

在这里插入图片描述
继续前进,到达加密这部分,我们看下getEncryptionCipherKey方法在这里插入图片描述
在这里插入图片描述
我们可以看下这个是直接返回的值,进一步分析由来在这里插入图片描述在最初,没有直接赋值,通过setCipherKey方法获得的值赋给加密密钥和解密密钥在这里插入图片描述

在这里插入图片描述
我们查看generateNewKey方法在这里插入图片描述
在这里插入图片描述
因为这一步算是初始化中,调试的话需要重新启动调试,并不是在登录过程中触发,直接打断点是触发不了的
init方法完成了初始化密钥生成器,然后再generateKey方法中生成密钥
在这里插入图片描述
在这里插入图片描述使用 this.random 随机数生成器生成随机字节,并填充到 var2 数组中再返回SecretKeySpec对象
在这里插入图片描述
最后回到最初,通过getEncoded方法获取密钥序列

3.2 漏洞点分析

我们发现版本更新点以后,那么这个漏洞产生在什么地方呢,我发现网上大部分的文章都说是要进行Padding Oracle Attack来攻击漏洞,但是分析下来感觉对但是有的又说的不是很全面

3.2.1 Padding Oracle Attack

填充提示攻击( Padding Oracle Attack ),Padding的含义是“填充”,在解密时,如果算法发现解密后得到的结果,它的填充方式不符合规则,那么表示输入数据有问题,对于解密的类库来说,往往便会抛出一个异常,提示Padding不正确
但是它本身的使用是有条件的
1.攻击者能够获得密文,以及密文对应的初始化向量iv
2.攻击者能够触发密文的解密过程,并且能够知道密文的解密结果是否正确

3.2.2 满足条件一

我们首先分析条件一是怎么满足的,获得密文以及密文对应的初始化向量iv,咱们这个漏洞的前提就是有一个正常登录的rememberMe,所以密文条件直接达成

密码学里的iv,并没有保密性的要求,所以对于使用CBC Mode的加密算法来说,iv经常会随着密文一起发送。常见的做法是将iv作为一个前缀,附着在密文的前面。对于CBC Mode来说,iv的长度必须与分组的长度相等。

在进行加密的过程中,我们可以看到iv的产生,也就是ivBytes的值,为[-113, 11, 31, 89, 56, 39, 100, 25, 117, -77, -99, 81, 42, -30, -67, -110]

在这里插入图片描述
然后看整体aes加密后的值,iv的值[-113, 11, 31, 89, 56, 39, 100, 25, 117, -77, -99, 81, 42, -30, -67, -110]就在开头
在这里插入图片描述
所以我们通过解密获得的一个正常登录shiro的rememberMe,base64解码之后的首位16个字节就是此次的iv

3.2.3 满足条件二

条件二为能够触发密文的解密过程,并且能够知道密文的解密结果是否正确

我们查看解密过程,直接定位到AbstractRememberMeManager.decrypt方法
在这里插入图片描述
这里CipherService接口类decrypt()函数的实现类是org/apache/shiro/crypto/JcaCipherService类,decrypt()函数就是调用JcaCipherService类的decrypt()函数,我们逐步往下看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
这就是整个解密的过程,我们可以看到如果中间出什么错误的时候,只有一个捕获错误的,会抛出一个CryptoException异常

在dofinal方法中有 IllegalBlockSizeException和BadPaddingException 这两个异常,分别用于捕获块大小异常和填充错误异常,如果触发了会抛到crypt方法的异常捕获里
在这里插入图片描述
最终被getRememberedPrincipals() 方法捕获,并执行 onRememberedPrincipalFailure() 方法
在这里插入图片描述
在这里插入图片描述
最终会调用removeFrom(),在响应头部中添加字段Set-Cookie: rememberMe=deleteMe在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以如果Padding结果不正确的话,响应包就会出现Set-Cookie: rememberMe=deleteMe

我们利用这个机制,可以进行类似布尔盲注的攻击,通过观察有没有这个字段来判断有没有成功

3.3 CBC字节翻转攻击和Padding Oracle Attack

在算法分析方面这里只是简单说一下,更加详细的可以看看以下两位师傅的分析,非常明了

https://goodapple.top/archives/217
https://www.mi1k7ea.com/2020/10/14/%E6%B5%85%E6%9E%90Shiro-Padding-Oracle-Attack%EF%BC%88Shiro721%EF%BC%89/#0x06-%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90

3.3.1 CBC字节反翻转攻击

CBC字节翻转攻击是一种对分组密码的攻击,属于侧信道攻击。这种攻击针对的是CBC Mode,而不是某一种具体的分组密码算法。

CBC加密过程:
1.将需要加密的数据分组
2.第一个分组的明文在加密之前先和iv进行异或计算,然后进行加密运算
3.从第二组开始,所有的明文先于前一分组加密后的密文进行异或,然后进行加密运算
4.将所有加密后的密文组拼接到一起就是加密后的密文了

解密过程:
1.第一组密文在解密之后与初始向量iv异或得到第一组明文
2.第二组密文解密之后和第一组密文异或得到第二组明文
3.以此类推,得到所有明文组,最后拼接就是加密前的明文

也就是说,解密一组明文需要本组和前一组的密文。

CBC字节翻转攻击的核心原理是通过破坏一个比特的密文来篡改一个比特的明文。
通过CBC字节翻转攻击,假如我们能够触发加解密过程,并且能够获得每次加密后的密文。那么我们就能够在不知道key的情况下,通过修改密文或IV,来控制输出明文为自己想要的内容,而且只能从最后一组开始修改,并且每改完一组,都需要重新获取一次解密后的数据,要根据解密后的数据来修改前一组密文的值。

3.3.2 Padding Oracle Attack

Padding Oracle流程:

  • 当收到一个有效的密文(一个被正确填充并包含有效数据的密文)时,应用程序正常响应(200 OK)
  • 当收到无效的密文时(解密时填充错误的密文),应用程序会抛出加密异常(500 内部服务器错误)
  • 当收到一个有效密文(解密时正确填充的密文)但解密为无效值时,应用程序会显示自定义错误消息 (200 OK)
    我们可以使用程序的行为来确定提供的加密值是否被正确填充,在上面的代码分析中,我们分析出shiro中,如果填充不正确,那么在返回包中就会出现deleteMe字段

3.4 攻击分析

我们在了解了算法和代码结合产生的漏洞点之后,应该怎么利用Padding Oracle Attack
构造密文的步骤:
从最后一组开始,爆破出该组的intermediary并构造出iv,然后将本组的iv当作前一组的密文
爆破前一组的intermediary并构造出iv,然后将本组的iv当作前一组的密文

最后会得到第一组的iv,至此已经构造出了所有合法密文以及iv
tips:在CBC加密的过程中,流程是先把明文和iv进行异或,将异或得到的值称为intermediary,然后把intermediary进行加密得到最后的密文

3.5 后续修补

在Shiro 1.2.4之后,shiro放弃了CBC加密,引入了GCM加密方式

在这里插入图片描述
具体代码变化
https://github.com/apache/shiro/commit/a8018783373ff5e5210225069c9919e071597d5e#diff-d61135f70077e55187e227aa61a3f72eef52568787ecbd59913e8a609b35019c

4.参考

https://www.mi1k7ea.com/2020/10/14/%E6%B5%85%E6%9E%90Shiro-Padding-Oracle-Attack%EF%BC%88Shiro721%EF%BC%89/#0x06-%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90
https://goodapple.top/archives/217

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

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

相关文章

电子电气架构---EEA的发展趋势

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

RPA自动化流程机器人在财税管理中的作用

随着科技的飞速发展&#xff0c;人工智能和自动化技术正在改变市场竞争的格局&#xff0c;企业对于提高工作效率和准确性的要求日益提高。财税管理作为企业运营管理的核心环节之一&#xff0c;其数字化程度决定了企业发展的速度、广度和深度。因此&#xff0c;财税数字化成为各…

transformer-explainer

安装和启动 找到这个项目&#xff0c;然后装好了。 这个项目的目的如名字。 https://github.com/poloclub/transformer-explainerTransformer Explained: Learn How LLM Transformer Models Work with Interactive Visualization - poloclub/transformer-explainerhttps:/…

【算法】蚁群算法

一、引言 蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式搜索算法。它由Marco Dorigo于1992年提出&#xff0c;适用于解决组合优化问题&#xff0c;如旅行商问题&#xff08;TSP&#xff09;、车辆路径问题&#xff08;VRP&…

STM32初识

这边软件使用的是Keil5&#xff0c;主要介绍一下使用的一些注意事项。 创建工程部分&#xff1a; 创建工程方式有两种&#xff1a;使用Keil创建工程模板、 使用STM32CubeMX 新建一个工程 1.新建一个文件&#xff0c;添加文件&#xff1a; DOC工程说明 doc说明文档 Librarie…

联想集团2025届校招网申认知能力SHL测评深度解析

引言 随着联想集团校招季的到来&#xff0c;众多求职者正摩拳擦掌&#xff0c;准备在这场竞争激烈的选拔中脱颖而出。认知能力测评作为选拔过程中的重要环节&#xff0c;其重要性不言而喻。本文将对联想集团校招中使用的认知能力测评进行深度解析&#xff0c;为求职者提供全面而…

K8S - ConfigMap的简介和使用

什么是configMap Kubernetes中的ConfigMap 是用于存储非敏感数据的API对象&#xff0c;用于将配置数据与应用程序的镜像分离。ConfigMap可以包含键值对、文件或者环境变量等配置信息&#xff0c;应用程序可以通过挂载ConfigMap来访问其中的数据&#xff0c;从而实现应用配置的…

知识图谱构建实战:GraphRAG与Neo4j的结合之道

前言 我们在前面讲解 GraphRag 从原始文本中提取知识图谱和构建图结构的时候,最后存储的文件是parquet 格式,文件存储在下面文件夹: 这节我们就探索一下怎么将我们生成好的图谱文件导入到我们的 Neo4j 图数据库,最后进行可视化分析,也能和我们之前的项目混合检索结合起来…

Java Web|day7. Web会话跟踪(cookie与session)

Web会话跟踪(cookie与session) 会话&#xff08;Session&#xff09;跟踪是Web程序中常用的技术&#xff0c;用来跟踪用户的整个会话。 cookie 定义 cookie是某些网站为了辨别用户身份&#xff0c;进行Session跟踪而储存在用户本地终端上的数据&#xff08;通常经过加密&am…

虹科应用|增强型以太网交换机:如何实现同IP控制的高效网络管理?

导读&#xff1a;车载以太网交换机的配置和管理是确保数据流高效、安全传输的关键。虹科增强型以太网交换机&#xff08;EES&#xff09;通过其先进的功能&#xff0c;为用户提供了一种灵活且高效的解决方案。 随着车载网络对带宽需求的不断提高&#xff0c;虹科Technica推出一…

第二届EI机器视觉、图像处理与影像技术国际会议将于9月13-15日召开

第二届机器视觉、图像处理与影像技术国际会议&#xff08;The 2nd International Conference on Machine Vision, Image Processing & Imaging Technology&#xff0c;简称MVIPIT&#xff09;将于2024年9月13日-15日在中国张家口举行。 MVIPIT 2024聚焦机器视觉、图像处理…

如何将 CICD 模版重构为 CICD component?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

MFC画图示意八皇后问题的含义

八皇后问题是C语言算法的一个经典例子; 它要求解的问题是, 以国际象棋为背景,有八个皇后(八个棋子),如何在 8*8 的棋盘中放置八个皇后,使得任意两个皇后都不在同一条横线、纵线或者斜线上。 根据资料,答案不止一个,共有92个;可以有92种摆法; 第一个答案应该是如…

小程序学习day08-导航传参、下拉刷新(移动端的专有名词)、上拉触底(移动端的专有名词)、自定义编译模式、生命周期

34、导航传参 &#xff08;1&#xff09;声明式导航传参 1&#xff09;Navigator组件的url属性用来指定将要跳转到页面的路径&#xff0c;同时&#xff0c;可以携带参数 2&#xff09;携带参数的要求 ①参数与路径之间用?分隔 ②参数键与参数值之间用相连 ③不同参数用&…

如何在手机版和网页版Facebook上更改名字(2024)

本文将详细介绍如何在Facebook上更改名字&#xff0c;包括手机和网页版Facebook的具体步骤&#xff0c;以及添加Facebook昵称的方法&#xff0c;并分享如何高效管理多个Facebook网页版账户。 Facebook怎么改名字 Facebook手机版改名 打开Facebook APP并登录账号。 点击右下角的…

TinTinLand Web3 + DePIN 共学月|深入探索 DePIN 项目,全景分析去中心化网络未来

「TinTinLand Web3 主题共学月」是由 TinTinLand 每月发起的主题学习活动&#xff0c;携手知名项目共同打造一个系统化、互动性强的学习平台&#xff0c;帮助开发者不断提升技能&#xff0c;紧跟 Web3 技术的前沿发展。活动通过演示视频、学习打卡、模拟环境、实际操作等多种方…

2024-08-16升级记录:使用Android RecyclerView控件显示列表型信息

在页面上使用RecyclerView实现一个列表型信息展示&#xff1a; 步骤如下&#xff1a; 一、在页面布局中添加RecyclerView控件 <TextViewandroid:id"id/txt_gnss_info"android:layout_width"match_parent"android:layout_height"wrap_content"…

学习node.js 二 path模块,os模块,process

目录 path模块 1. path.basename() 2. path.dirname 3. path.extname 4. path.join 5. path.resolve 6. path.parse path.format OS模块 1. 获取操作系统的一些信息 &#xff08;1&#xff09;os.platform() &#xff08;2)os.release &#xff08;3&#xff09;os.ho…

1.1GB大更新,华为Pura70系列鸿蒙新版本优化哪些方面

华为Pura70 Pro手机迎来了其操作系统的又一次重要更新&#xff0c;推送了鸿蒙4.2.0.176新版本。这次升级不仅在安全性、音效和智慧多窗等方面进行了优化&#xff0c;还集成了2024年7月的安全补丁&#xff0c;为用户带来了更加安全、流畅的使用体验。 1.升级包内容丰富 华为Pur…

Python编码系列—掌握Python Web开发:Flask与FastAPI实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…