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

目录

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.mzph.cn/news/174094.shtml

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

相关文章

arcgis pro使用自定义svg图标

1.点击目录窗格中的样式 可以将本地图标加载到收藏夹中 2.右键收藏夹&#xff0c;点击管理样式 3.双击收藏夹进入此页面 4.在空白处右键&#xff0c;点击新建 5.选中新建的符号&#xff0c;更改图标 6.上传完毕&#xff0c;点击应用即可使用 7.效果 8.此外也可以直接上传图片…

【Linux】vim-多模式的文本编辑器

本篇文章内容和干货较多&#xff0c;希望对大家有所帮助&#x1f44d; 目录 一、vim的介绍 1.1 vi 与 vim的概念1.2 Vim 和 Vi 的一些对比 二、vim 模式之间的切换 2.1 进入vim2.2 [正常模式]切换到[插入模式]2.3 [插入模式]切换至[正常模式]2.4 [正常模式]切换至[底行模式…

怎么快速制作一本出色的电子期刊!

比起传统纸质期刊&#xff0c;电子期刊有着众多的优势&#xff0c;它打破了以往的传播形式和人们传统的时空观念&#xff0c;从而更加贴近人们的生活&#xff0c;更好地满足新时代人们对文化生活的更高要求。如何制作电子期刊呢&#xff1f; 其实很简单&#xff0c;只需要使用…

【在线AI绘画平台】哩布AI 在线生成图片、训练Lora、上传AI生成图简易实测

文章目录 一、主页面介绍1.1首页[网址 https://www.liblib.ai/](https://www.liblib.ai/)侧边栏可收起 1.2 模型页面1.2.1 按模型筛选相关1.2.2 封面的细节1.2.3 点击后进入封面&#xff1a; 二、在线生成图片2.1 直接从主页面进入2.1.1 在线生成的链接&#xff08;与webui几乎…

代理模式-C语言实现

UML图&#xff1a; 代码实现&#xff1a; #include <stdio.h>// 抽象主题接口 typedef struct {void (*request)(void*); } Subject;// 具体主题类 typedef struct {void (*request)(void*); } RealSubject;void RealSubject_request(void* obj) {printf("RealSubj…

win10下载Remix IDE桌面版以及空白页面的解决

文章目录 Remix IDE 的下载Remix IDE 空白页面的解决 Remix IDE 的下载 到 github 地址 https://github.com/ethereum/remix-desktop/releases 选择exe文件或根据自己电脑版本选择对应的zip文件进行下载&#xff0c;然后正常安装即可。 Remix IDE 空白页面的解决 有时打开Remix…

docker容器的生命周期管理常用命令

容器的生命周期管理命令 docker create &#xff1a;创建一个新的容器但不启动它 docker create nginx docker run :创建一个新的容器并运行一个命令 常用选项&#xff1a; 常用选项1. --add-host&#xff1a;容器中hosts文件添加 host:ip 映射记录 2. -a, --attach&#…

【STL】string类 (下)

目录 1&#xff0c;insert 2&#xff0c;erase 3&#xff0c;find 4&#xff0c;replace 5&#xff0c;rfind 6&#xff0c;substr 7&#xff0c;find_first_of 8&#xff0c;find_first_not_of 9&#xff0c;find_last_of 10&#xff0c;operator 11&#xff0c;ge…

深入理解对象与垃圾回收机制

1、虚拟机中对象创建过程 1.1 对象创建过程 当我们使用 new 创建一个对象时&#xff0c;在 JVM 中进行了如下操作&#xff1a; 类加载&#xff1a;把 class 加载到 JVM 运行时数据区的过程。可以通过本地文件的形式&#xff0c;也可以通过网络加载。 检查加载&#xff1a;首…

【23真题】大题全原题的211!题源已定位!

今天分享的是23年长安大学814的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年长安大学814考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题难度中等偏下&#xff0c;题量偏多&#xff0c;考察的知识点也是很常见的…

Robot Framework自动化测试(四)--- 分层思想

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;LLAMA是…

如何往excel中写子表?

with pd.ExcelWriter("C:/last_date.xlsx") as writer:for i in range(0, 10):df pd.DataFrame()df.to_excel(writer, indexFalse, sheet_namestr(days[i 1]))

OpenCV入门11——图像的分割与修复

文章目录 图像分割的基本概念实战-分水岭法(一)实战-分水岭法(二)GrabCut基本原理实战-GrabCut主体程序的实现实战-GrabCut鼠标事件的处理实战-调用GrabCut实现图像分割meanshift图像分割视频前后景分离其它对视频前后影分离的方法图像修复 图像分割是计算机视觉中的一个重要领…

Docker智驾开发环境搭建

文章目录 背景1. 什么是容器?2. 什么是Docker?2.1 Docker架构3. 为什么要使用Docker?3.1 Docker容器虚拟化的好处3.2 Docker在开发和运维中的优势4. Docker容器与传统虚拟化的区别4.1 区别4.2 Docker的优势5. Docker的核心概念6. Docker在嵌入式开发中的应用7. docker实践参…

deque容器结构学习笔记

1.结构图 2.deque对比vector和list deque双端队列&#xff0c;就像是list和vector的结合 vector&#xff1a; 优点&#xff1a;1.可以随机读取 2. 空间利用率高 缺点&#xff1a;1. 除了尾插尾删&#xff0c;其他插入删除效率比较低 2. 扩容效率低 list&#xff1a; 优点&…

好用的png图片打包plist工具,推荐使用pngPackerGUI_V2.0

png图片打包plist工具&#xff0c;手把手教你使用pngPackerGUI_V2.0此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件&#xff0c;得到如下目录&#xff0c;双击打开 pngPackerGUI.e…

C++STL——string类详解及其模拟实现

CSTL——string类 1. STL简介 STL全称standard template libaray&#xff0c;译为标准模板库 需要注意&#xff0c;STL不是C的标准库&#xff0c;而是C标准库的重要组成部分STL是一个包含众多数据结构和算法的软件框架 下面展示STL的六大组件&#xff1a; 本章&#xff0c;我…

三季度营收持续上涨,高途终于“松了一口气”?

近日&#xff0c;高途发布2023年第三季度财报。财报数据显示&#xff0c;高途实现净收入7.89亿元&#xff0c;同比增长30.2%。 同时&#xff0c;高途还透露了对于“AI教育”的布局。AI的发展无疑会给高途更大的机遇和更多的期待。随着人工智能技术在公司产品和服务各环节的落地…

HTML5+CSS3+JS小实例:九宫格图片鼠标移入移出方向感知特效

实例:九宫格图片鼠标移入移出方向感知特效 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport&…