[Java安全]HashMap的readObject都发生了什么

2024-01-19 14:48

本文主要是介绍[Java安全]HashMap的readObject都发生了什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 写在前面
  • 分析(以URLDNS为例)
  • 分析LinkedHashSet,HashSet,TreeSet等类为什么不可以

写在前面

这篇文章的灵感来自纯好奇大佬的文章
当然推荐大家看看大佬的文章,学点骚操作,我只是顺便分析一下为什么这样可以而已,大佬可乐嗯觉得这些比较简单没有写原因,那我来学习学习顺便记录,大佬文章直达
Java反序列化数据绕WAF之加大量脏数据

分析(以URLDNS为例)

首先我们要知道ObjectInputStream的readObject的调用栈,来个网图自己懒的画,很简单的关系
在这里插入图片描述

至于为什么URLDNS,便于我更好的进行跟踪操作,仅此而已
首先看看函数调用栈,看关键的
在这里插入图片描述

首先是去触发readObject方法
在这里插入图片描述
这个s根据地址来看769那就是和上面图对应部分的输入流
在这里插入图片描述
那么我想要知道ObjectInputStream都干了些什么,将文件流传入BlockDataInputStream

在这里插入图片描述
再传入
在这里插入图片描述

前面这一部分没啥分析的意义,就是一些初始化读取属性过程
在这里插入图片描述
我这里直接跳过垃圾数据那阶段了,反正都是一样的道理

跟入
在这里插入图片描述
继续跟入
在这里插入图片描述
这里根据数据流类型进入对应分支
在这里插入图片描述
看这里似乎是对流执行了序列化
在这里插入图片描述
跟进

在这里插入图片描述
跟进
在这里插入图片描述
跟进lookupObject
在这里插入图片描述
查找并返回与给定句柄相关的对象
在这里插入图片描述
实例化
在这里插入图片描述

在这里插入图片描述
很明显了到这里
在这里插入图片描述

后面就是到URLDNS链子了,没必要了
在这里插入图片描述

分析LinkedHashSet,HashSet,TreeSet等类为什么不可以

文章里面师傅说的有点小错误,不是所有的例子都不可以,这里以URLDNS的HashSet为例,可以看到这里因为Hashcode不为-1被返回了

,可以
去找一下hashcode咋来的
在这里插入图片描述
可以看见重点是primVals
在这里插入图片描述

好奇这个哪来的吗,跟入URL的readFields
在这里插入图片描述
跟入
在这里插入图片描述
这里进行了简单的初始化,下面过程比较枯燥
在这里插入图片描述
接下来到readFields
在这里插入图片描述
跟进
在这里插入图片描述
继续跟进
在这里插入图片描述
再往下跟进
在这里插入图片描述
继续往下跟进
在这里插入图片描述

可以看到最终调用了readBytes是个native方法,没办法往下跟进的
在这里插入图片描述
在这里插入图片描述
具体原因就出这里了,有兴趣的大佬可以试试分析Java底层C实现这个方法

这篇关于[Java安全]HashMap的readObject都发生了什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622767

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在