java反序列化浅探
刚打完蓝桥杯,摆!
核心类:
ObjectOutputStream
:IO 类,包含序列化对象的方法,writeObject()
ObjectInputStream
:IO 类,包含反序列化对象的方法,readObject()
Serializable
,接口,是一个标志性接口,标识可以在 JVM 中进行序列化,JVM 会为该类自动生成一个序列化版本号。参与序列化与反序列化的类必须实现 Serializable 接口
serialVersionUID
,类属性,序列化版本号,用于给 JVM 区别同名类,没有提供版本号,JVM会默认提供序列化版本号
transient
,关键字,让某些数据不参与序列化
序列化与反序列化的过程
也就是将 Java 对象对象的状态保存下来存储到文件中的过程就叫做序列化。
将硬盘中保存了 Java 对象状态的字节序列按照编号组装成对象恢复到内存中,这个过程称为反序列化。
serialVersionUID
当类名相同时,JVM 就会通过序列化版本号来区分 Java 类,序列化版本号不同就为不同的类
tips:序列化一个对象时,如果没有指定序列化版本号,后期对该类的源码进行修改并重新编译后,会导致修改前后的序列化版本号不一致,因为 JVM 会提供一个新的序列化版本号给该类对象
此时再用以往的反序列化代码去反序列化该类的对象,就会抛出异常 java.io.InvalidClassException
,所以序列化一个类时最好指定一个序列化版本号,或者永远不修改此类。
定义:
简单写法就是在首行添加
public class Student implements Serializable {private static final Long serialVersionUID = 1122233;
}
序列化/反序列化举例
#student
package student;
import java.io.Serializable;
public class student implements Serializable {private String name;public int age;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';}public student(String name,int age) {this.name = name;this.age = age;}}
#ser
package student;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ser {public static void main(String[] args) throws Exception {
student o = new student("xiaoming",12);ObjectOutputStream oss = new ObjectOutputStream((new FileOutputStream("student")));oss.writeObject(o);oss.flush();oss.close();}
}
#unser
package student;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.ObjectInputStream;
public class unser {public static void main(String[] args) throws Exception {ObjectInputStream s =new ObjectInputStream(new FileInputStream("student"));Object obj = s.readObject();System.out.println(obj);s.close();}
}
transient 关键字
简单来说就是当你不想序列化类中某个某个属性,即可用transient去定义,这样序列化时就略过这个属性了
public class Student implements Serializable {private static final Long serialVersionUID = 1122233;private String name;private transient int age;//在反序列化时就不能会输出该属性,默认恢复成 null 或 0
}
可以看见起作用了,默认输出了null或者0;
注意事项:
说一下自己理解的小节吧:
1.序列化对象要调用ser接口
2.序列化只针对属性,不针对方法
3.最好设置一个序列化号,防止出错
4.同一对象序列化多次,只有第一次序列化为二进制流,以后都只是保存序列化编号,不会重复序列化。
5.序列化对象的引用类型成员变量,也必须是可序列化的,否则,会报错,也就是说只要进行序列化的对象,都要进行ser接口的实现
java反序列化浅探相关推荐
- 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)
摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...
- Delphi的对象机制浅探[转载]
Delphi的对象机制浅探 savetime2k@yahoo.com 2004-1-3 前几天开始阅读 VCL 源代码,可是几个基类的继承代码把我看得头大.在大富翁请教了几位仁兄后,我还是对Delph ...
- java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
0x00 前言 1. 描述 官方github描述: Java Unmarshaller Security - Turning your data into code execution "将 ...
- java反序列化漏洞的一些gadget
目录 0x00 URLDNS 0x01 Commons Collections 0x02 RMI的codebase任意代码执行 0x03 JNDI 0x04 LDAP 0x05 JDK7u21 首先说 ...
- java 反序列化漏洞 利用思路简介
目录 序列化的过程 readObject方法 反射链 完成反序列漏洞实践 结论 之前听别人讲解反序列化的漏洞听的晕乎乎的,刚脆就趁着周末研究一下反序列化漏洞,并且搭建实战环境实际操作了一把,明白了之后 ...
- java 反序列化漏洞简介
目录 一.Java的序列化与反序列化 二.对java序列化的理解 三.反序列化的漏洞原理概述 四.关于反射链 一.Java的序列化与反序列化 在这里我们直接自己定义一个类,然后对这个类的对象(一个实例 ...
- java 反序列化 ysoserial exploit/JRMPListener 原理剖析
目录 0 前言 1 payloads/JRMPClient 1.1 Externalizable 1.2 生成payload 1.3 gadget链分析 2 exploit/JRMPListener ...
- ysoserial java 反序列化 Groovy1
ysoserial简介 ysoserial是一款在Github开源的知名java 反序列化利用工具,里面集合了各种java反序列化payload: 由于其中部分payload使用到的低版本JDK中的类 ...
- 【关于学习渗透】手把手教你玩转java反序列化cb链
前言 java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍.记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学 ...
最新文章
- 信号与系统期末考试2020春季学期试题准备
- cesium 3dtiles 加载本地数据_Meteva笔记:加载本地观测数据
- 解耦 多态性 java_java多态
- 基于C#局域网语音聊天
- 11.MapReduce第1部分
- nfs服务器_Kubernetes集群下部署NFS持久存储
- Python 3 - 如何下载视图和保存证书
- 用极域课堂管理系统软件批量格式化D盘
- Java基础问题整理
- 超五类网线和超六类网线的区别
- github创建代码仓库并上传代码
- 通信原理第三章:正弦波加窄带高斯噪声
- 拆掉思维里的墙读书笔记
- 如何在Oracle数据库中使用dbms_output输出内容
- H5 iOS 自动调起软键盘
- 执行董事和CEO有什么区别
- C# 终本案件、综合执行人、裁判文书爬虫
- 2021美赛E题题译+思路+参考资料
- 用Python告诉你广州房租现状
- 【CODECHEF】Children Trips(分块)
热门文章
- Java开源JEE框架
- Chap和pap认证
- 帝国cms模板如何开启支持php,帝国cms模板使用说明与技巧
- bilibili服务器维护7月,GitHub - thestarweb/bilibilidan: 一个B站弹幕姬,就是不会在第一时间维护。。支持插件!!...
- 常见颜色RGB颜色值
- 【装机】老毛桃的安装及使用教程
- window的dos命令学习笔记 七
- Angular Material 图标素材网址与使用
- 更改所有数据透视表的数据源
- mysql查询权限show grants_[MySQL]查看用户权限与GRANT用法