经典的Shiro反序列化漏洞复现

news2025/1/10 17:03:54

目录

0x01、前言

0x02、环境搭建

0x03、漏洞原理

0x04、漏洞复现

0x05、漏洞分析

5.1、加密

5.2、解密

0x06、总结


0x01、前言


相信大家总是面试会问到java反序列化,或者会问到标志性的漏洞,比如shiro反序列化,或者weblogic反序列化漏洞。

那我就这篇文章为大家讲解一下,不懂的哥哥直接背一下,理解一下就好了。

至于为什么要选择shiro反序列化呢,不讲weblogic呢?

因为我上次有幸参与金鸡电影节的临时安全负责人,具体我就不细说了。当时是内部涉及到shiro反序列化漏洞。

准确的来说是Shiro<1.2.4-RememberMe反序列化漏洞。

而它也被称为Shiro 550反序列化漏洞。

细品细品...

0x02、环境搭建


下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4

环境:Tomcat 8.5.27 + idea 2020.2 + jdk 1.8 +maven 3.6

图片

下载之后之后直接打开,并open这个web文件夹即可,其他自行百度就行,其中还需要导入一些jstl的jar等等

0x03、漏洞原理


shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:

得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化

然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

payload 构造的顺序则就是相对的反着来:

恶意命令-->序列化-->AES加密-->base64编码-->发送cookie

在整个漏洞利用过程中,比较重要的是AES加密的密钥,该秘钥默认是默认硬编码的,所以如果没有修改默认的密钥,就自己可以生成恶意构造的cookie了。

shiro特征:

  • 未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段

  • 登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段

  • 不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段

  • 勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段

0x04、漏洞复现


图片

复现文章https://blog.csdn.net/weixin_43571641/article/details/108182722

0x05、漏洞分析


简单介绍利用:

  • 通过在cookie的rememberMe字段中插入恶意payload,

  • 触发shiro框架的rememberMe的反序列化功能,导致任意代码执行。

  • shiro 1.2.24中,提供了硬编码的AES密钥:kPH+bIxk5D2deZiIxcaaaA==

  • 由于开发人员未修改AES密钥而直接使用Shiro框架,导致了该问题

5.1、加密


那既然我们要分析,那入口点在哪呢?

Shiro≤1.2.4版本默认使用CookieRememberMeManager

图片

而我们看看这边CookieRememberMeManager类继承了AbstractRememberMeManager,我们进去看看是什么梗

图片

我们可以看到这边这个类里面有硬编码。

然后它又继承了RememberMeManager接口;我们继续进去看看是怎么回事

图片

看名字的话可以知道这些是登陆成功,登陆失败,退出的一些service;既然如此,肯定会调用这个登陆成功的接口,然后再去实现这个接口。

所以我们直接在这个接口下个断点,看看是怎么个流程;

图片

这里看到调用了isRememberMe()可以发现这个就是一个判断用户是否选择了RememberMe选项。而我们是勾选了的

图片

所以我们我们条件满足,这边判断返回True,我们则进入this.rememberIdentity(subject, token, info);

图片

subject存储的一些登陆信息如session等等,而authcInfo存储的则是用户名;

图片

而PrincipalCollection是一个身份集合,因为我们可以在Shiro中同时配置多个Realm,所以呢身份信息可能就有多个;因此其提供了PrincipalCollection用于聚合这些身份信息,具体我们不细讲,不深入去懂原理。

然后我们再F7继续跟进this.rememberIdentity(subject, principals);

图片

这我们有点懵,将身份信息干嘛?

我们进入该convertPrincipalsToBytes()方法查看;

图片

看到了serialize()方法,难道这边开始是进行序列化了还是啥?

图片

图片

图片

通过此处我们可以知道是跳了两层,到DefaultSerializer类的serialize方法;

看到这里就懂了,这里先转为byte,写入缓冲区;

然后进行了一个序列化,最后通过toByteArray()方法返回序列化后的Byte数组。

图片

然后返回到原来的地方convertPrincipalsToBytes()内,接下来if判断getCipherService()方法不为空,则进入条件里面里面。

我们f7进去内部看看;

图片

发现又是一个cipherService,这是什么;我们翻译一下,因为大部分开发都会用简称;

图片

也就是获取密码服务??什么密码服务?我们再继续F7跟进发现直接推出了。

那我们就 Ctrl+左键 继续进去看。可以,发现是new了一个aes加密服务。

图片

那我们点击debugger处,回到刚刚那个地方;我们就不用继续进入了,我们就思考一下,这边是要获取到加密服务,如果没获取到,则不进入。

获取到的话,则进入该条件;

图片

直接F8下来,进入,然后我们再手动添加变量监视。

可以发现正如我们所想的,获取aes加密服务;

然后调用encrypt()方法,而懂点英文的,都知道这个单词是加密的意思。

那我们初步判断这是个加密方法。

我们f7跟进去看看什么情况。

图片

我们可以知道这个参数是byte[] serialized,也就是说,此处加密我们刚刚的序列化流的数据。

然后这边this.getCipherService()我们刚刚手动添加变量查看了,这边是获取到了aes加密服务;然后判断不问空,那肯定不为空啊,刚刚上面分析过了。然后我们进入条件判断股内部。

ByteSource byteSource = cipherService.encrypt(serialized, this.getEncryptionCipherKey());

这里调用cipherService.encrypt()方法并且传入序列化数据,和getEncryptionCipherKey方法。

加密过程,我们就应该不怎么感兴趣了;有兴趣的可以自己研究

图片

我们通过getEncryptionCipherKey()名字可以知道是获取key的一个方法。

那我们f7进入看看

图片

哦豁,那我们再进一层看一下;发现直接就返回了,emmmmm….怎么跟别人不一样。

那我们就不追了

图片

第一步有说到,硬编码存储在这个地方,而构造方法就在这下面,可以看到这边设置了key。

图片

我们继续回到原来的地方,知道这边是获取加密的key就ok了。

然后这边使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。那我们加密部分就结束了

图片

5.2、解密


由于此处,我找不到,回溯不到,那咋办,烦恼;最后想到了我们加密的入口~~

图片

图片

图片

既然自动跳到了这里,那么我们就直接在此处下个断点,重新开始

图片

随后我们进入这个getRememberedSerializedIdentity()方法,看看是什么东西。

此处我们依然还很懵,没事;

图片

一直f8,期间倒是没有什么有意思或者重点的地方;

图片

直到我们走到这里,这个有一个this.getCookie().readValue(request, response),这是要读取cookice中的数据了,这必须跟入了;

图片

这里给进到了这个readvalue()方法中了,我们先看看什么情况。

根据名字可以知道是读取值的一个方法。读取什么值?请求包的值。

通过getName()方法得到了key为remeberMe。然后把value置空,再通过getCookie获取到cookie。

最后判断cookie不为空,则进入内部;

随后获取到cookie的值;值则为序列化内容。然后再 return回序列化内容;

图片

随后返回到上一处地方现在remeberMe的值不是delete;而是序列化内容,所以进入到第二个条件分支。

图片

一直到这一步,进行base64解码,成为二进制数据,给了decoded的byte数组;

得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化

目前只进行了Base64解码,那还需要aes解码。我们继续跟进

图片

返回到了上层,此处我们知道bytes是二进制数据,我们看看条件判断。当bytes数组不为空且长度大于0时,进入里面。那我们肯定满足,所以我们两步f8加一步F7进入到 convertBytesToPrincipals看看是什么

图片

可以看出我们接下来的步骤要依依实现了。判断key不为空,然后进入内部

图片

图片

而从这里开始,就是进行aes解密的步骤了,我们F7跟进方法查看

图片

这里重新把恶意的bytes数组重新赋值给serialized,然后再获取加密服务:AES/CBC/PKCS5Padding

图片

同时到达了下一步;真真正正的开始解密了,其中两个参数,第一个是加密的bytes数组,第二个是获取到key,也就是硬编码;我们 就直接进入decrypt()方法中

图片

解密过程的话,我不擅长密码学,这种看着我头晕,涉及到aes啥的加密解密我就会跳过。所以依旧一样,跳!!!

图片

此处继续返回到了上一层,我们可以看出这个byteSource是aes解密出来的序列化流,然后再默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组serialized中,那接下来我们就差反序列化了

得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化

我们继续return,返回到上一层

图片

顾名思义,一看名字就知道是反序列化的方法,我们跟进deserialize()方法查看

图片

看到还有一层,我们继续F7跟进

图片

形成反序列化漏洞的话,没有readObject()怎么可能呢?

所以我们看到了最后一道光,就这么愉快的结束了。

0x06、总结

其实这个还是得学习学习加密解密的方法,才能进行编写poc,但是此处只是了解个思路。具体可参考其他文章;

https://www.anquanke.com/post/id/225442#h2-7

https://mp.weixin.qq.com/s/ayZKDVnN7zEbKjo5w8uqxQ

图片

没看够~?欢迎关注!

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

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

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

相关文章

EasyExcel生成多sheet页的excel

一、controller层 ApiOperation(value "明细查询导出") PostMapping(value "/SummaryDetailExport") public void summaryDetailExport(RequestBody SearchDTO dto, HttpServletResponse response) throws IOException {reportService.deptPackagingSum…

sql中的left join, right join 和inner join,union 与union all的用法

left join&#xff0c; right join 和inner join&#xff1a;这些都是SQL中用来连接两个或多个表的操作。 union&#xff0c;union all&#xff1a;用于合并两个或多个 SELECT 语句的结果。 但是有时候&#xff0c;对于Select出来的结果集不是很清楚。 假设我们有两张表。pers…

2019年12月19日 Go生态洞察:Go模块化之旅

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

本地Nginx服务搭建结合内网穿透实现多个Windows Web站点公网访问

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

软件建模与文档:架构师怎样绘制系统架构蓝图?

Java全能学习面试指南&#xff1a;https://javaxiaobear 首先&#xff0c;请你设想这样一个场景&#xff1a;如果公司安排你做架构师&#xff0c;要你在项目开发前期进行软件架构设计&#xff0c;你该如何开展你的工作&#xff1f;如何输出你的工作成果&#xff1f;如何确定你的…

js获取当前时间并转换各种形式

执行代码 const time new Date();console.log(time);console.log(time.toDateString());console.log(time.toTimeString());console.log(time.toJSON());console.log(time.toISOString());console.log(time.toLocaleDateString());console.log(time.toLocaleString());console…

【面经八股】搜广推方向:面试记录(三)

【面经&八股】搜广推方向:面试记录(三) 文章目录 【面经&八股】搜广推方向:面试记录(三)1. 编程题1.1 大数乘法1.2 大数加法2. 项目介绍3. 有了解过的广告推荐模型吗4. 广告模型回归问题1. 编程题 上来直接写编程题,有点儿懵逼。 1.1 大数乘法 可以参考 该博…

​使用PotPlayer播放器查看软解和硬解4K高清视频时的CPU及GPU占用情况​

目录 1、问题说明 2、PotPlayer播放器介绍 3、视频的软解与硬解 4、使用PotPlayer查看4K高清视频软解和硬解时的CPU占用情况 4.1、使用软解时CPU和GPU占用情况 4.2、使用硬解时CPU和GPU占用情况 5、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅…

13年测试,自动化测试-常见问题总结,测试进阶专项...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试简介…

NX二次开发UF_CURVE_ask_point_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_point_data Defined in: uf_curve.h int UF_CURVE_ask_point_data(tag_t point, double point_coords [ 3 ] ) overview 概述 Returns the coordinates for the spec…

Redis面试题:Redis集群方案有哪些,介绍一下主从同步

目录 面试官&#xff1a;Redis集群有哪些方案? 面试官&#xff1a;介绍一下主从同步 面试官&#xff1a;主从同步数据的流程&#xff08;主从数据同步原理&#xff09; 面试官&#xff1a;Redis集群有哪些方案? 候选人&#xff1a;嗯~~&#xff0c;在Redis中提供的集群方案…

成都优优聚美团代运营——让您脱颖而出!

随着互联网的快速发展&#xff0c;越来越多的企业开始注重线上业务的拓展&#xff0c;而美团作为国内领先的生活服务平台之一&#xff0c;自然成为了许多品牌宣传和推广的重要渠道。在成都地区&#xff0c;优优聚美团代运营公司凭借多年的经验和专业团队的优势&#xff0c;成为…

蓝牙概述及基本架构介绍

蓝牙概述及基本架构介绍 1. 概述1.1 蓝牙的概念1.2 蓝牙的发展历程1.3 蓝牙技术概述1.3.1 Basic Rate(BR)1.3.2 Low Energy&#xff08;LE&#xff09; 2. 蓝牙的基本架构2.1 芯片架构2.2 协议架构2.2.1 官方协议中所展示的蓝牙协议架构2.2.1.1 全局分析2.2.1.2 局部分析 2.2.2…

矢量图片转换软件Vector Magic mac中文版功能特色

Vector Magic mac是一款图片转换矢量图&#xff0c;该软件使用世界上最好的全彩色自动描摹器&#xff0c;快速准备好您的作品进行打印、绣花、剪裁等操作。 Vector Magic mac功能特色 只需上传即可在线自动将 JPG、PNG、BMP 和 GIF 位图图像转换为真正的 SVG、Eps 和 PDF 矢量…

【前端】three.js

文章目录 概述three.js-master目录结构Threejs 的基本要素场景相机透视相机正交相机 网格2d3d 灯光AmbientLight(环境光)平行光&#xff08;DirectionalLight&#xff09;点光源&#xff08;PointLight&#xff09;聚光灯&#xff08;SpotLight&#xff09; 渲染器 Threejs 的实…

NABOCUL集团专注科研创新 为内源护肤、护发提供更优选择

据权威媒体报道,日本知名化妆品集团NABOCUL Cosmetics株式会社研通过多年的科技创新和内源护肤研究,创新研发Olandu、TakuMin、“CIMIVOSOTUY”等核心成分,向中国消费者传递“关爱恒久之美”的理念,更好地释放内源护肤的独特魅力,为人们内源护肤、护发提供了全新选择。 据了解,…

如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件

我们在开发MFC、VC、C项目时&#xff0c;有时候需要操作excel文件的读写&#xff0c;我们一般常用方式是调用微软的excel驱动方式调用&#xff0c;但调用驱动前&#xff0c;我们需要生成我们C能够调用到的头文件&#xff0c;一般常用文件有&#xff1a; #include "CAppli…

内网穿透的应用-Jupyter Notbook+cpolar内网穿透实现公共互联网访问使用数据分析工作

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

spirng+maven实现的宠物管理系统

spirngmaven实现的宠物管理系统,演示地址:登录页面 共分为3中角色 管理员 账号&#xff1a;admin 密码&#xff1a;123456 医生&#xff1a; 账号&#xff1a;医生1 密码&#xff1a;123456 普通用户&#xff1a; 账号&#xff1a;1 密码&#xff1a;123456 数据库为mysql5.7…

人工智能入门,什么是AlphaGo式搜索?

AlphaGo式搜索是一种搜索算法&#xff0c;它是由DeepMind开发的AlphaGo团队在开发AlphaGo程序时使用的搜索策略。 AlphaGo是一个基于人工智能的围棋程序&#xff0c;它在2016年击败了世界冠军柯洁&#xff0c;引起了广泛的关注。 AlphaGo式搜索的核心思想是使用蒙特卡洛树搜索…