【Shiro反序列化漏洞】shiro550流程分析

🍬 博主介绍

👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!


目录

0x1 前言

0x2 漏洞原理

0x3 漏洞分析

加密过程

解密过程

0x4 总结


0x1 前言

Shiro-550反序列化漏洞大约在2016年就被披露了,但感觉直到近一两年,在各种攻防演练中这个漏洞才真正走进了大家的视野,Shiro-550反序列化应该可以算是这一两年最好用的RCE漏洞之一,原因有很多:Shiro框架使用广泛,漏洞影响范围广;攻击payload经过AES加密,很多安全防护设备无法识别/拦截攻击……

shiro550基础环境的搭建,我是参照别的博客,这里给师傅们推荐下:

shiro-550 IDEA环境配置-CSDN博客

总结要下载的环境配置:
jdk1.8:https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html

tomcat8.5.99:https://tomcat.apache.org/download-80.cgi

shiro漏洞源码:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4

这里给师傅们提示下,如果师傅们用的是开源版的idea,那么这里后面利用idea配置tomcat的时候,就会出问题,因为开源版的idea没有web功能,所以建议师傅们使用付给版的idea(因为我就是这莫过来的,很头大!!!)

这里给师傅们推荐下破解idea的文章:

Docs

环境搭建成功了之后,运行tomcat,浏览器就会自动弹出这个页面:

0x2 漏洞原理

根据漏洞描述,Shiro≤1.2.4版本默认使用CookieRememberMeManager,其处理cookie的流程是:

先获取cookie中的remberMe值 --> 对其base64解码 --> AES解码 --> 对解密的值反序列化

然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞

payload 构造的顺序则就是相对的反着来:

构造恶意命令 --> 序列化 --> AES加密 --> base64编码 --> 发送cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,该秘钥默认是默认硬编码的,所以如果没有修改默认的密钥,就自己可以生成恶意构造的cookie了。

0x3 漏洞分析

加密过程

我们先进入登录界面,然后登录root用户,记得这里要勾选Remember Me 选项,然后利用burp抓包,需要注意的是,抓这个页面的POST包,因为还有一个GET包,但是这个GET包没有rememberMe 加密的字段。

注意看划重点的这几个地方,特别是rememberMe里面的加密内容

我们先打开idea,然后双击shift快捷键进行检索Cookie,然后找到跟CookieRememberMeManager有关的代码文件进行分析。

而我们看看这边CookieRememberMeManager类继承了AbstractRememberMeManager,我们在ctrl + B AbstractRememberMeManager

我们可以看到这边这个类里面有硬编码。

然后它又继承了RememberMeManager接口,我们继续进去看看是怎么回事

点击分别查看这几个函数,知道这些是登陆成功,登陆失败,退出的一些service

我们再重新分析下代码文件:

在org/apache/shiro/mgt/DefaultSecurityManager.java代码的rememberMeSuccessfulLogin方法下断点

跟进onSuccessfulLogin方法,具体实现代码在AbstractRememberMeManager.java。

public void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info) {
        //always clear any previous identity:
        forgetIdentity(subject);

        //now save the new identity:
        if (isRememberMe(token)) {
            rememberIdentity(subject, token, info);
        } else {
            if (log.isDebugEnabled()) {
                log.debug("AuthenticationToken did not indicate RememberMe is requested.  " +
                        "RememberMe functionality will not be executed for corresponding account.");
            }
        }
    }


调用forgetIdentity方法对subject进行处理,subject对象表示单个用户的状态和安全操作,包含认证、授权等。

继续跟进forgetIdentity方法,getCookie方法获取请求的cookie,接着会进入到removeFrom方法。

removeForm主要在response头部添加Set-Cookie: rememberMe=deleteMe

然后再回到onSuccessfulLogin方法中,如果设置rememberMe则进入rememberIdentity。

rememberIdentity方法代码中,调用convertPrincipalsToBytes对用户名进行处理。

protected void rememberIdentity(Subject subject, PrincipalCollection accountPrincipals) {
        byte[] bytes = convertPrincipalsToBytes(accountPrincipals);
        rememberSerializedIdentity(subject, bytes);
    }


进入convertPrincipalsToBytes,调用serialize对用户名进行处理。

protected byte[] convertPrincipalsToBytes(PrincipalCollection principals) {
        byte[] bytes = serialize(principals);
        if (getCipherService() != null) {
            bytes = encrypt(bytes);
        }
        return bytes;
    }


跟进serialize方法来到org/apache/shiro/io/DefaultSerializer.java,很明显这里对用户名进行了序列化。

再回到convertPrincipalsToBytes,接着对序列化的数据进行加密,跟进encrypt方法。加密算法为AES,模式为CBC,填充算法为PKCS5Padding。

getEncryptionCipherKey获取加密的密钥,在AbstractRememberMeManager.java定义了默认的加密密钥为kPH+bIxk5D2deZiIxcaaaA==。

加密完成后,继续回到rememberIdentity,跟进rememberSerializedIdentity方法。

对加密的bytes进行base64编码,保存在cookie中。至此,加密的流程基本就分析完了。

解密过程

给大家参考下这位大佬的博客:

https://changxia3.com/2020/09/03/Shiro反序列化漏洞笔记一(原理篇)/

 

0x4 总结

从上面的分析可以知道,大体的漏洞触发流程为:

先获取cookie中的remberMe值 --> 对其base64解码 --> AES解码 --> 对解密的值反序列化

所以Shiro反序列化漏洞一个很关键的点就在于AES解密的密钥,攻击者需要知道密钥才能构造恶意的序列化数据。在Shiro≤1.2.4中默认密钥为kPH+bIxk5D2deZiIxcaaaA==。官方针对这个漏洞的修复方式是去掉了默认的Key,生成随机的Key。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

续篇:展开聊下 state 与 渲染树中位置的关系

🐾 上篇的结尾处,提到了 > 为了提升性能, React 仅在渲染之间 存在差异 时才会更改 DOM 节点。 本篇,✓ 🇨🇳 展开聊下 state 与 渲染树中位置的关系 📢📢📢 状态与…

Java学习笔记之IDEA的安装与下载以及相关配置

1 IDEA概述 ​IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境: ​把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 2 IDEA…

【视觉三维重建】【论文笔记】Deblurring 3D Gaussian Splatting

去模糊的3D高斯泼溅,看Demo比3D高斯更加精细,对场景物体细节的还原度更高,[官网](https://benhenryl.github.io/Deblurring-3D-Gaussian-Splatting/) 背景技术 Volumetric rendering-based nerual fields&#xff1a…

GZ083 产品艺术设计赛题第五套

全国职业院校技能大赛 产品艺术设计赛项赛题五 赛项名称 产品艺术设计 英语名称 Product Art Design 赛项编号 GZ083 归属产业 数字产业 任务名称 “境•享”家用台式加湿器设计 赛项组别 中职组 高职组 □学生组 □教师组 □师生联队试点赛项 R学生组 □教师组…

【线程】封装 | 安全 | 互斥

线程封装(面向对象) 1.组件式的封装出一个线程类(像C11线程库那样去管理线程) 我们并不想暴露出线程创建,终止,等待,分离,获取线程id等POSIX线程库的接口,我们也想像C1…

机器学习模型—K最近邻(KNN)

机器学习模型—K最近邻(KNN) K最近邻 (KNN) 算法是一种用于解决分类和回归问题的监督机器学习方法。Evelyn Fix 和 Joseph Hodges 于 1951 年开发了该算法,随后 Thomas Cover 对其进行了扩展。本文探讨了 KNN 算法的基本原理、工作原理和实现。 虽然 k近邻算法 (KNN) 可以用…

基于Pytest+Allure+Excel的接口自动化测试框架

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…

接口自动化测试实战之pytest框架+allure讲解

一、前言 本文章主要会讲解Python中pytest框架的讲解,介绍什么是pytest、为何要测试、为何使用以及参考和扩展等等,话不多说,咱们直接进入主题哟。 二、pytest讲解 2.1 什么是pytest? pytest是一款单元测试框架,在…

Linux -- 线程互斥

一 线程互斥的概念 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的…

激光打标技术:现代制造业的精准标记解决方案

随着科技的飞速进步,激光打标机技术已经成为现代制造业中不可或缺的一部分。作为一种快速、精确、耐用的标记解决方案,激光打标技术以其独特的优势,为现代制造业提供了精准、高效、持久的标记解决方案。 首先,激光打标技术以其无与…

吴恩达机器学习笔记 十七 通过偏差与方差诊断性能 正则化 偏差 方差

高偏差(欠拟合):在训练集上表现得也不好 高方差(过拟合):J_cv要远大于J_train 刚刚好:J_cv和J_train都小 J_cv和J_train与拟合多项式阶数的关系 从一阶到四阶,训练集的误差越来越小…

挂耳式耳机什么牌子的好?掌握六大挂耳式耳机选购秘诀

随着科技的进步,蓝牙耳机逐渐成为人们日常生活中的热门配件。很多人选择蓝牙耳机,是为了在娱乐学习时享受便捷的无线体验。这些耳机不仅设计时尚,佩戴起来也极为舒适。 蓝牙耳机主要分为挂耳式和入耳式。尽管入耳式耳机功能齐全,…

在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

目录 一、分布式寻址算法 1. hash 算法 2. 一致性 hash 算法 3. Redis cluster 的 hash slot 算法 二、Redis cluster 的高可用与主备切换原理 1. 判断节点宕机 2. 从节点过滤 3. 从节点选举 4. 与哨兵比较 一、分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash…

Python的time模块与datetime模块大揭秘!

1.time 模块 t主要用来操作时间,还可以用于控制程序 导入time模块 import time 2.获取从1970年1月1日0时0分0秒距今的秒数:time.time() print(time.time()) 3.格式化显示时间:time.strftime() print(time.strftime("%Y-%m-%d %H:…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

使用 Python+Selenium + 第三方库实现简单的web自动化测试框架 源码

一、配置(config) 1.1 说明 设置自动化案例运行时的属性值。 安排自动化案例的执行顺序。 所在路径: …\Project_Selenium\config 1.2 文件 1.2.1 config.ini 目录: …\Project_Selenium\config\config.ini 配置字段: 1 [PROJECT] 1.1 bro…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

📷 江池俊:个人主页 🔥 个人专栏:✅C那些事儿 ✅Linux技术宝典 🌅 此去关山万里,定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

十四、Nacos源码系列:Nacos配置发布原理

目录 一、简介 二、加密处理 三、发布配置 3.1、插入或更新配置信息 3.2、发布配置数据变动事件 3.2.1、目标节点是当前节点 3.2.2、目标节点非当前节点 四、总结 一、简介 一般情况下,我们是通过Nacos提供的Web控制台登录,然后通过界面新增配置…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程:1.前端用户提交用户名,密码 2. 序列化器校验用户名,密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

图【数据结构】

文章目录 图的基本概念邻接矩阵邻接表图的遍历BFSDFS 图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构 顶点和边:图中结点称为顶点 权值:边附带的数据信息 路径 : 简单路径 和 回路: 子图:设图G {V, E}和图G1…
最新文章