shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析

1c284c726376d114049a41a783993752.png

Apache Shiro

Apache Shiro是一个功能强大且灵活的开源安全框架,主要功能包括用户认证、授权、会话管理以及加密。在了解该漏洞之前,建议学习下Apache Shiro是怎么使用.

debug环境

  • jdk1.8
  • Apache Shiro 1.2.4
  • 测试demo

本地debug需要以下maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-web --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.4</version></dependency>

漏洞产生流程

一般登录时,存在记住我的功能,如下图:

fd9c8708d2cee3eb571428c7aaf8c684.png

Apache Shiro框架就是在实现该功能时存在漏洞.

Apache Shiro如何记住我?

  1. 序列化用户身份对象.(这里为SimplePrincipalCollection)
  2. 对序列化后的数据进行AES加密,密钥为常量.
  3. base64编码
  4. 设置到cookie中,cookie name等于rememberMe.

Apache Shiro如何解析我?

  1. 读取cookie中的rememberMe的值.
  2. 对其值进行base64解码.
  3. AES解密
  4. 反序列化

我们如何攻击?

通过以上,我们可以看出,只要手动构造一个反序列化payload,进行AES加密(密钥我们知道的)和base64编码,即可在反序列化时执行任何操作.

源码解析

记住我源码分析

打开登录界面,输入admin/vulhub,勾选Remember me,点击登录.首先进入用户代码中调用Apache Shiro验证接口的方法.

cd04b6c551540cdb9b00443d42ffb5fb.png

接着正式进入Apache Shiro处理. 一些不重要的调用过程省略,调用栈如下:

0231f72824746187d3c48f527a03b148.png

我们在org.apache.shiro.mgt/AbstractRememberMeManager.onSuccessfulLogin下断点.

389ff30ef3509cbad4059a32399f2bfc.png

从上面代码我们发现,首先程序清理了验证信息.接着调用rememberIdentity来保存新的验证信息.跟进该方法.

a9ea8cd4ba729aa8963a01fee855d1d8.png

我们发现该方法首先去获取一个PrincipalCollection对象.该对象就是保存在cookie中的对象.接着调用rememberIdentity保存该对象.跟进rememberIdentity方法.

c748cf2516b10ff7bfadc8514d9e3a6a.png

我们先看它是如何反序列化和AES加密的.跟进byte[] bytes = convertPrincipalsToBytes(accountPrincipals);.

5f2c9a8d23f25dd50e02ba4459e7d3a3.png

从以上代码可以发现,调用serialize序列化为byte数组.这一步不做分析.我们重点看看如何进行AES加密的.跟进encrypt(bytes).

449c38af6a673629bb5a0e6318fb24ae.png

首先该方法获取AES加密service.再通过getEncryptionCipherKey()得到密钥.最后对序列化后的对象进行加密.其中密钥是一个常量,该常量在org/apache/shiro/mgt/AbstractRememberMeManager.AbstractRememberMeManager设置.常量值如下:

67a51b758e351e133b4fbdd21a25c157.png

回到rememberIdentity方法,我们继续来看下面的rememberSerializedIdentity方法.

340929fbba5b79d9181e15e6025af67b.png

通过以上过程,Apache Shiro完成了如何记住我.

解析我源码分析

在源码分析之前,提一个debug遇到的坑,Apache Shiro在设置rememberme这个cookie的同时也会设置一个JSessionid cookie,当通过浏览器进行发送请求,请删除掉JSessionid cookie,否则Apache Shiro通过JSessionid获取验证信息,并不会经过解析我的过程,也就无法debug 我们在上一步登录后,删除JSessionid cookie,访问http://localhost:8080.在org/apache/shiro/mgt/DefaultSecurityManager.getRememberedIdentity下断点.

b2264f00c0b102c209ae5e417ce7cd5f.png

该方法主要获取存储在cookie中的Principal对象,我们跟进getRememberedPrincipals方法内.

cbf281a743486edf1d9d2acba96a28be.png

从上述源码可以发现,通过getRememberedSerializedIdentity进行cookie的提取和base64解密.接着通过convertBytesToPrincipals进行AES解密和反序列化得到Principals对象.我们重点看看convertBytesToPrincipals该方法.

578f5051f5adeb68a9d3fbac8b140bf5.png

很显然,该方法中通过decrypt进行AES解密.跟进decrypt.

93d8b78b08a5cda48da92f74a3dbdb0c.png

该方法和加密基本一样.先获取cipherService,再通过密钥解密. 再回到convertBytesToPrincipals方法中.调用deserialize进行反序列化.至此反序列化漏洞的触发过程就结束了.

修复

我们再来看看1.2.5如何修复的. 1.2.5:

c66494d4bfbc6a628d273434522f1c52.png

1.2.4:

3416e593afb9c7b40bef7a4ec93afeac.png

通过上述可以看出1.2.5将密钥动态生成.避免了攻击者可以自己生成序列化恶意对象.这个漏洞可以说是硬编码密钥导致的反序列化漏洞.

最后

关于该漏洞的利用可以参考vulhub.该文章旨在分享,后面也会就vulhub上的demo来做一系列的漏洞原理的分享.

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

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

相关文章

window 下的mysql_Windows下MySQL下载安装、配置与使用

用过MySQL之后&#xff0c;不论容量的话&#xff0c;发现比其他两个(sql server 、oracle)好用的多&#xff0c;一下子就喜欢上了。下面给那些还不知道怎么弄的童鞋们写下具体的方法步骤。(我这个写得有点太详细了&#xff0c;甚至有些繁琐&#xff0c;有很多步骤在其他的教程文…

Pytorch 自定义激活函数前向与反向传播 ReLu系列 含优点与缺点

文章目录ReLu公式求导过程优点&#xff1a;缺点&#xff1a;自定义ReLu与Torch定义的比较可视化Leaky ReLu PReLu公式求导过程优点&#xff1a;缺点&#xff1a;自定义LeakyReLu与Torch定义的比较可视化自定义PReLuELU公式求导过程优点缺点自定义LeakyReLu与Torch定义的比较可视…

mybatis select count(*) 一直返回0 mysql_Mybatis教程1:MyBatis快速入门

点击上方“Java技术前线”&#xff0c;选择“置顶或者星标”与你一起成长一、Mybatis介绍MyBatis是一个支持普通*SQL*查询&#xff0c;存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML…

css预处理器sass使用教程(多图预警)

css预处理器赋予了css动态语言的特性&#xff0c;如变量、函数、运算、继承、嵌套等&#xff0c;有助于更好地组织管理样式文件&#xff0c;以及更高效地开发项目。css预处理器可以更方便的维护和管理css代码&#xff0c;让整个网页变得更加灵活可变。对于预处理器&#xff0c;…

Sharepoint学习笔记—Site Definition系列-- 2、创建Content Type

Sharepoint本身就是一个丰富的大容器&#xff0c;里面存储的所有信息我们可以称其为“内容(Content)”&#xff0c;为了便于管理这些Conent&#xff0c;按照人类的正常逻辑就必然想到的是对此进行“分类”。分类所涉及到的层面又必然包括: 1、分类的标准或特征描述{即&#xf…

arduino byte转string_Java数组转List集合的三驾马车

点击上方 蓝字关注我们来源&#xff1a;blog.csdn.net/x541211190/article/details/79597236前言本文中的代码命名有的可能不太规范&#xff0c;是因为没法排版的问题&#xff0c;小仙已经很努力去解决了&#xff0c;希望各位能多多点赞、分享。好了&#xff0c;不多bb了(不要让…

ES6笔记(4)-- Symbol类型

系列文章 -- ES6笔记系列 Symbol是什么&#xff1f;中文意思是标志、记号&#xff0c;顾名思义&#xff0c;它可以用了做记号。 是的&#xff0c;它是一种标记的方法&#xff0c;被ES6引入作为一种新的数据类型&#xff0c;表示独一无二的值。 由此&#xff0c;JS的数据类型多了…

手把手教你如下在Linux下如何写一个C语言代码,编译并运行

文章目录手把手教你如下在Linux下如何写一个C语言代码&#xff0c;编译并运行打开Ubuntu终端创建 helloworld.c编译C文件手把手教你如下在Linux下如何写一个C语言代码&#xff0c;编译并运行 打开Ubuntu终端 我这里的终端是Windows下的WSL&#xff0c;如果有疑问&#xff0c;…

邮件群发工具的编写(二)数据的保存

数据的保存与读取 人类是在不断探索与改进中进步的 上一篇&#xff0c;邮件群发工具的编写&#xff08;一&#xff09;邮件地址提取&#xff0c;我们讲到了邮箱的提取。 那么这一篇&#xff0c;讲一下提取完的邮箱信息的保存和读取。 首先&#xff0c;我希望对上一篇邮箱提取类…

c++ lambda函数_C++11 之 lambda函数的详细使用

1. lambda 函数概述lambda 表达式是一种匿名函数&#xff0c;即没有函数名的函数&#xff1b;该匿名函数是由数学中的λ演算而来的。通常情况下&#xff0c;lambda函数的语法定义为&#xff1a;[capture] (parameters) mutable ->return-type {statement}其中&#xff1a;[c…

pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图

记录一下怎样pytorch框架下怎样获得模型的梯度 文章目录引入所需要的库一个简单的函数模型梯度获取先定义一个model如下定义两个获取梯度的函数定义一些过程与调用上述函数的方法可视化一下梯度的histogram引入所需要的库 import os import torch import torch.nn as nn impor…

ubuntu升级python_Ubuntu 升级python3为更高版本【已实测】

2020-04-13 更新安装步骤&#xff1a; 1. 先update一下 sudo apt update 2. 安装依赖库 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

Framework打包

2019独角兽企业重金招聘Python工程师标准>>> iOS app需要在许多不同的CPU架构下运行&#xff1a; arm7: 在最老的支持iOS7的设备上使用 arm7s: 在iPhone5和5C上使用 arm64: 运行于iPhone5S的64位 ARM 处理器 上 i386: 32位模拟器上使用 x86_64: 64为模拟器上使用…

windows 10 下利用WSL的Linux环境实现vscode C/C++环境的配置

本文主要结合二个工具&#xff0c;介绍如何在windows搭建Linux开发环境&#xff1a; WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目录WSL安装VSCode安装配置Linux下的C/C环境1. 打开WSL的控制台2. 更新ubuntu软件3. 安装GCC和GDB4. 配置VSCode(1). 打开…

Windows 11下 WSL使用 jupyter notebook

这里写目录标题前言在WSL下的配置测试运行更优雅的启动方法配置jupyter生成默认配置文件生成秘钥修改配置文件nohup启动前言 一直都使用jupyter notebook&#xff0c;不管做数据分析&#xff0c;还是调试代码&#xff0c;还有写文章都是。但是好像在WSL下又不好使。看了网上有…

sql2000导出mysql_如何将sql2000的数据库导入到mysql中?

展开全部先用SQl2000导出e68a843231313335323631343130323136353331333262373366文本文件&#xff0c;把后缀名改为CSv&#xff0c;再从Mysql中一导入OK参考&#xff1a;第一种是安装mysql ODBC&#xff0c;利用sql server的导出功能&#xff0c;选择mysql数据源&#xff0c;进…

实现日、周、月排行统计 sql

在如今很多系统中&#xff0c;都需要进行日、周、月排行统计&#xff0c;但是在网上寻找 了一番&#xff0c;发现很多都是相对的周、月排行&#xff0c;即周排行则用当前时间减去7天。这样我个人认为并不恰当。如月排行中&#xff0c;假设今天是4月22日,则从3月22日至4月22日之…

产品运行所需的信息检索失败_为服务业注入新活力,华北工控推出服务机器人专用计算机产品方案...

近年来&#xff0c;随着人口老龄化趋势加快和信息科技革命的持续推进&#xff0c;服务机器人已经被当作社会劳动力的一部分在医疗、教育、餐饮等行业广泛应用&#xff0c;市场潜力巨大。01、需求带动消费&#xff0c;科技改变服务服务机器人是国内智能机器人产业发展最快的分支…

Windows更新没有更新提示:从windows 10升级到Windows 11,并WSL下配置cuda

文章目录从windows 10 升级到Windows 11安装WSL的安装配置cuda从windows 10 升级到Windows 11 升级的方法有很多种&#xff0c;各大网站都有。有更新提示的按更新提示操作即可。我的是一直都没有更新提示&#xff0c;也搜索过网上的一些方法&#xff0c;但都不行。还是没法更新…

js修改css样式属性_这个笔记《CSS样式的常见属性及值》,让菜鸟轻松学会包粽子...

常见样式属性及值字体:font-family-size-style: normal(正常)|italic(倾斜)|oblique-weight: normal|bold(粗体)如果组合起来编写: font: style weight size family字体大小的单位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平对齐方式): left|center|righ…