Shiro 550反序列化漏洞分析

一、漏洞简介

影响版本:Apache Shiro < 1.2.4

特征判断:返回包中包含rememberMe=deleteMe字段。

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

那么,Payload产生的过程:

命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

二、环境搭建

下载后用idea配置tomcat启动:https://github.com/Medicean/VulApps/tree/master/s/shiro/1

利用工具:https://github.com/wyzxxz/shiro_rce_tool

三、漏洞分析

shiro会提供rememberme功能,可以通过cookie记录登录用户,从而记录登录用户的身份认证信息,即下次无需登录即可访问。而其中对rememberme的cookie做了加密处理,漏洞主要原因是加密的AES密钥是硬编码在文件中的,那么对于AES加密算法我们已知密钥,并且IV为cookie进行base64解码后的前16个字节,因此我们可以构造任意的可控序列化payload。

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

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

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

1)加密过程

处理rememberme的类为org.apache.shiro.web.mgt.CookieRememberMeManager,它继承AbstractRememberMeManager类,当登录成功并且勾选了rememberme选项,那么此时将进入onSuccessfulLogin方法

把断点下到rememberIdentity后,跟进rememberIdentity方法

继续跟进rememberIdentity方法后,可以看到调用了convertPrincipalsToBytes方法后得到了个bytes,然后传入了rememberSerializedIdentity

其实在convertPrincipalsToBytes中进行了加密操作,我们可以跟进查看

可以看到通过序列化拿到了个bytes,然后在362行进行了encrypt操作,这里就是加密进行的地方了,跟进查看

看471行,拿到了个CipherService类,这个类就是用来进行加密的,打开可以看到加密模式为CBC,Padding规则是PKCS5,加密方式为AES

然后473行进行了加密操作,查看在其参数中的getEncryptionCipherKey方法,这个方法就是用来获取密钥的,此密钥硬编码在了类中,并进行了base64编码

回到之前的encrypt方法中,等加密完成后,把值return给了前面说的的bytes,然后传进了rememberSerializedIdentity方法

rememberSerializedIdentity方法中,把加密的字符串进行了Base64编码,然后设置到了cookie中

2)解密过程

在shiro中,解密过程就是和加密过程相反的了,解密过程在AbstractRememberMeManager#getRememberedPrincipals方法中

首先调用getRememberedSerializedIdentity方法,方法中获得了cookie中的rememberMe的值然后进行base64解码并返回给了bytes

第二步就是调用convertBytesToPrincipals方法来进行解密

跟进convertBytesToPrincipals方法

先进行了decrypt解密,然后再进行的deserialize反序列化。

查看decrypt,这里和之前加密过程步骤差不多,用的密钥都是同一个

查看反序列化方法deserialize

getSerializer()返回的是一个默认的序列化对象DefaultSerializer

跟进DefaultSerializer#deserialize看到了熟悉的反序列化

四、漏洞修复

Apache Shiro 1.2.5版本的源码,修复方法就是shiro每次启动,都会随机生成一个新的key:https://github.com/apache/shiro/commit/4d5bb000a7f3c02d8960b32e694a565c95976848

Shiro 550反序列化漏洞分析的更多相关文章

  1. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  2. Apache Shiro Java反序列化漏洞分析

    1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...

  3. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  4. 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计

    Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.   Apache Shiro默认使用了CookieRe ...

  5. Java安全之Cas反序列化漏洞分析

    Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...

  6. 25. Apache Shiro Java反序列化漏洞

    前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...

  7. Fastjson 1.2.22-24 反序列化漏洞分析

    目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...

  8. ref:Java安全之反序列化漏洞分析(简单-朴实)

    ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...

  9. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

随机推荐

  1. 我对数据库关系代数中减法sql实现的思考:mysql脚本

    一.创建数据库,创建表结构 CREATE DATABASE Test_sub DEFAULT CHARACTER SET utf8; USE Test_sub; CREATE TABLE studen ...

  2. git tag的用法及意义

    git tag 介绍 命令是用来给当前项目状态(在某次commit后)打标签的,目的是便于以后将项目状态回滚到当时打标签的状态.可以把它与虚拟机的snapshot(快照)进行类比. 回想当时在看< ...

  3. AndroidJetpack数据处理之数据库Room和懒加载Paging

    数据库工具:Room Room结构 导入依赖 app的build.gradle中开启kapt: apply plugin: 'kotlin-kapt' 并导入以下依赖: def room_versio ...

  4. CodeReview杂谈

    豆皮粉儿们,大家好,又见面啦,今天由字节跳动的"躬冯"带来一个 code review 的故事. 作者:躬冯 2020年元旦假期到来的时候,孙总攒了个局,又把当年一起创造过屎山的咱 ...

  5. 再见了,我的散装研发管理平台;再见了,4台ECS!

    周末的时候,收到好几个云服务器临近过期的通知短信,准备续个费,居然都要大几千!因为这几个都是以前低价抢购的,掐指一算,如果都续费的话,要蚕食好多利润!作为一名自己养活自己的独立开发者,节省成本是必备技 ...

  6. python3 爬虫五大模块之二:URL管理器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  7. 乐肴2.0环境改名后,需要删除原来的软链接(public/storage)

    rm -rf public/storage php artisan storage:link

  8. PyRevit开发第一步:获取Revit文档Document

    1.安装PythonShell插件 PythonShell 2018 插件下载 交流QQ群: 17075104 新建项目后,运行功能Python Shell, 在弹出的窗口中复制或输入以下引用代码模块 ...

  9. IDEA创建Maven项目做Java Web时无WEB-INF/classes的问题

    昨天开始学习Java Web中的Servlet,学到用IntelliJ IDEA创建Java Web项目时,跟着课程上老师的步骤一步步做,却发现运行时Servlet找不到.坑爹的是,练习建项目时,一模 ...

  10. Vue指令及自定义指令的使用

    导航列表: 一.vue指令 二.自定义指令 一.vue指令 回到顶部    1. v-text v-text主要用来更新textContent,可以等同于JS的text属性,不会解析标签,会把标签解析 ...