当前位置: 首页 > news >正文

反序列化底层学习

反序列化底层学习

前言

以前也是懒得学,觉得没有必要,学到现在发现好多东西都需要学习java的底层,而且很多漏洞都是通过反序列化底层挖出来的,比如weblogic的一些绕过,我这里也主要是为了学习weblogic来学习的,所以一些细节不关注

DEMO

import java.io.*;
public class Main {public static class Demo implements Serializable {transient String name;public Demo(String name) {this.name = name;}public static void main(String[] args) throws IOException, ClassNotFoundException {Demo demo = new Demo("nn0nkey");ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("panda.out"));outputStream.writeObject(demo);outputStream.close();ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("panda.out"));inputStream.readObject();}}
}

反序列化分析

一般我们就知道反序列化会调用readobject方法,现在就好好分析一下readobject干了啥

首先判断是不是重载类型的,如果不是调用Object obj = readObject0(false);去恢复对象

image-20240625165822881

readObject0方法会对不同的类型进行不同的处理,我这里是object类型的

image-20240625170446323

readOrdinaryObject(unshared)我们继续看看是怎么处理的

内部调用ObjectStreamClass desc = readClassDesc(false);去读取我们的序列化流的描述信息,跟进

可以看到也是按照不同的类型去处理,有null,引用类型,代理类型,class类型

image-20240625170657019

我们进入到class类型

return readNonProxyDesc(unshared);

先进行一个检查是不是class类型,然后实例化一个desc对象,desc的信息是通过readClassDescriptor读取的

image-20240625170852928

跟进readClassDescriptor

image-20240625171409862

跟进readNonProxy

这个方法是真正意义上的操作

系统会先从字节流中读取类名信息name = in.readUTF();,其次从字节流中读取serialVersionUID的信息,然后再从字节流中读取各种SC_*标记信息,通过该标记信息设置对应的成员属性,最后从字节流中读取每一个字段的信息这些字段信息包括:TypeCodefieldNamefieldType

这里对应的方法是在序列化时使用的writeNonProxy方法,在writeNonProxy中写入的TypeCodefieldNamefieldType在这里被读取。

然后回到我们的readNonProxyDesc,封装好我的信息之后使用resolveClass(readDesc)处理为class

image-20240625171853201

resolveClass就是使用class.forname去加载

image-20240625171912221

image-20240625172542804

然后调用initNonProxy处理读取到的信息初始化

最后返回desc对象

image-20240625172627608

回到readOrdinaryObject方法

关键在

image-20240625172436903

做了一个判断desc.isExternalizable,如果序列化的接口是Externalizable类型,就进入readExternalData,否则进入readSerialData

如果我们的demo对象接口类型是Serializable,所以进入了readSerialData方法

readSerialData方法中用了反射进行调用反序列化对象的readObject方法

image-20210811104910320

然后回到readSerialData,会反射调用readResolve方法

image-20210811105200717

20201027155537-cca7961c-1829-1

总结

那么多read方法,我们总结一下

readobject:单纯的入口点

readobject0:可以说是我们的readobject方法的具体逻辑点,会跟进不同的字节流选择不同的方法去处理

readOrdinaryObject:用来处理我们的object对象类型的,它用于调用序列化类中,readObject、readResolve、readExternal的方法会有一些选择

readClassDesc :分发用于处理字节流中TC_CLASSDESC的方法,用switch来选择需要处理的方法

readNonProxyDesc :真正用来处理字节流中的TC_CLASSDESC方法,会调用resolveClass进行创建反序列化的对象

resolveClass:是用Class.forName来创建对象的地方,在这里可以做一个检查校验,用于反序列化拦截。

readNonProxy:真正读取我们描述信息的方法

参考

https://www.cnblogs.com/yyhuni/p/15127416.html

https://www.cnblogs.com/yyhuni/p/15127416.html

eadNonProxy:真正读取我们描述信息的方法

参考

https://www.cnblogs.com/yyhuni/p/15127416.html

https://www.cnblogs.com/yyhuni/p/15127416.html

https://www.cnblogs.com/yyhuni/p/15127416.html

相关文章:

反序列化底层学习

反序列化底层学习 前言 以前也是懒得学,觉得没有必要,学到现在发现好多东西都需要学习java的底层,而且很多漏洞都是通过反序列化底层挖出来的,比如weblogic的一些绕过,我这里也主要是为了学习weblogic来学习的&#…...

项目训练营第五天

项目训练营第五天 后端代码优化 通用异常处理类编写 Data public class BaseResponse<T> implements Serializable {int code;T data;String message null;String description null;public BaseResponse(int code, T data, String message, String description) {th…...

数据收集和数据分析

数据分析和收集是一个多步骤的过程&#xff0c;涉及到不同的方法和思维构型。 以下是一些常见的数据收集方法和数据分析的思维模式&#xff1a; ### 数据收集方法&#xff1a; 1. **调查问卷**&#xff1a; 通过设计问卷来收集定量或定性数据。&#xff08;质量互变规律里面…...

Kubernetes(K8s)从入门到精通系列之十九:Operator模式

Kubernetes K8s从入门到精通系列之十九&#xff1a;Operator模式 一、动机二、Operators in Kubernetes三、Operator示例四、部署Operator五、使用Operator六、编写自己的operator Operator 是 Kubernetes 的软件扩展&#xff0c;它利用自定义资源来管理应用程序及其组件。 Ope…...

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下&#xff0c;返回状态为fulfilled&#xff0c;值为undefined。 所以可以直接进行.then操作&#xff1a; this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …...

【干货】Jupyter Lab操作文档

Jupyter Lab操作文档1. 使用须知2. 定制化Jupyter设置主题显示代码行数设置语言更多设置 3. 认识Jupyter界面4. 初用Jupyter运行调试格式化查看源码 5. 使用Jupyter Terminal6. 使用Jupyter Markdown7. 上传下载文件&#xff08;云服务器中的Jupyter Lab&#xff09;上传文件到…...

iOS分享到微信,配置Universal Links,并从微信打开app,跳转到指定界面

iOS分享到微信之后&#xff0c;需要从微信浏览器直接打开app&#xff0c;跳转到指定界面&#xff0c;这个时候最主要的就是分以下几步(微信sdk集成就不说了) 1.配置Universal Links Universal Links是iOS新系统出来后通用链接&#xff0c;用于在第三方浏览器直接打开app&…...

基于SSM构建的校园失眠与压力管理系统的设计与实现【附源码】

毕业设计(论文) 题目&#xff1a;基于SSM构建的校园失眠与压力管理系统的设计与实现 二级学院&#xff1a; 专业(方向)&#xff1a; 班 级&#xff1a; 学 生&#xff1a; 指导教师&a…...

SAP 初始化库存移动类型561501511区别简介

项目上线初始化库存经常会用到561这个移动类型&#xff0c;同时我们在平时测试的过程中也会用到会进行库存的初始化&#xff0c;用的比较多是就是561和501这两个移动类型&#xff0c;本文将测试移动类型561&501&511这三个移动类型&#xff0c;分析三者之间的区别&#…...

情感搞笑聊天记录视频:AI自动化生成技术,操作简单,教程+软件

在数字化时代&#xff0c;内容创作已成为吸引观众、传递信息的重要手段。随着人工智能技术的飞速发展&#xff0c;AI自动生成视频为创作者提供了新的工具和可能性。本文将介绍如何利用AI技术&#xff0c;通过情感搞笑聊天记录视频&#xff0c;在视频号上实现内容的自动化生成&a…...

RabbitMQ中lazyqueue队列

lazyqueue队列非常强悍 springboot注解方式开启 // 使用注解的方式lazy.queue队列模式 非常GoodRabbitListener(queuesToDeclare Queue(name "lazy.queue",durable "true",arguments Argument(name "x-queue-mode",value "lazy&…...

Java三层框架的解析

引言&#xff1a;欢迎各位点击收看本篇博客&#xff0c;在历经很多的艰辛&#xff0c;我也是成功由小白浅浅进入了入门行列&#xff0c;也是收货到很多的知识&#xff0c;每次看黑马的JavaWeb课程视频&#xff0c;才使一个小菜鸡见识到了Java前后端是如何进行交互访问的&#x…...

算法设计与分析 笔记

截图摘自湖南大学彭鹏老师的ppt。笔记也是根据他的ppt整理的。 动态规划 核心 用数组记录中间结果&#xff0c;避免重复计算 三角数塔问题 问题描述 给定一个三角形数塔&#xff0c;从顶部出发&#xff0c;每次只能移动到下一行的相邻元素。要求找到一条路径&#xff0c;…...

mapreduce的工作原理

mapreduce的工作原理 MapReduce是一种编程模型&#xff0c;用于处理大规模数据集的并行运算。它的核心思想是"分而治之"&#xff0c;即把一个大数据集分解成多个小块&#xff0c;由多个处理单元并行处理&#xff0c;然后再将结果合并以得到最终结果。MapReduce模型包…...

vue中v-bind和v-model有什么区别

在Vue.js中&#xff0c;v-bind和v-model都是指令&#xff0c;用于实现数据和DOM元素之间的双向绑定&#xff0c;但它们的使用场景和功能有所区别。 v-bind: v-bind是一个通用指令&#xff0c;用于动态地绑定一个或多个属性&#xff0c;或者一个组件prop到表达式。它可以绑定任何…...

基于SpringBoot和PostGIS的某国基地可视化实战

目录 前言 一、Java后台开发设计与实现 1、模型层实现 2、控制层设计 二、WebGIS界面实现 1、列表界面的定义 2、全球基地可视化 三、成果展示 1、全球部署情况 2、亚太地区 3、欧洲基地分布 4、中东的部署 四、总结 前言 在之前的博客中&#xff0c;我们曾经对漂亮…...

为什么Linux服务器空间充足而实际上空间已满的原因

以下是一个典型的Linux服务器的磁盘空间使用情况表&#xff0c;展示了不同文件系统的大小、已用空间、可用空间和挂载点等信息 磁盘空间表的基本组成 Linux服务器的磁盘空间使用情况通常通过df命令查看&#xff0c;输出的表格包含以下几列&#xff1a; Filesystem&#xff1a…...

【LC刷题】DAY16:530 501 236

【LC刷题】DAY16&#xff1a;530 501 236 文章目录 【LC刷题】DAY16&#xff1a;530 501 236530. 二叉搜索树的最小绝对差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索树中的众数236. 二叉树的最近公共祖先 [link](htt…...

Vue 3 的 Teleport 组件实现跨层级通信

突破组件边界 - 使用 Vue 3 的 Teleport 组件实现跨层级通信 你可能已经熟悉了组件的基本概念:每个组件都是一个独立的单元,拥有自己的模板、样式和逻辑。但是,有时候我们需要在不同层级的组件之间进行交互,这就需要用到 Vue 3 中新引入的 Teleport 组件。 Teleport 组件可以…...

chromadb

Chroma是一款AI开源向量数据库&#xff0c;用于快速构建基于LLM的应用&#xff0c;支持Python和Javascript语言。具备轻量化、快速安装等特点&#xff0c;可与Langchain、LlamaIndex等知名LLM框架组合使用。 官网&#xff1a; https://www.trychroma.com/ https://docs.trychr…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...