JAVA审计之反序列化漏洞-ONE
本文主要探究反序列化漏洞出现的原因是什么!超详解!安全开发
JAVA 序列化反序列化的概念
01什么是反序列化
把对象转换为字节序列的过程称为对象的序列化。序列化是为了将数据转化成字节流,以便存储在文件中或在网络上传输。
把字节序列恢复为对象的过程称为对象的反序列化。反序列化就是开打字节流并重构对象。
02为什么要反序列化
当两个进程进行通信时,可以相互发送各种类型的数据(文本,音频等)这些数据会以二进制序列的形式在网络上传输。当java进程通信时是否能实现进程间的对象传输,这时候就需要Java的序列化和反序列化了。
序列化and反序列化代码详解
1我们进行一段简单代码的编写,演示一下java进行序列化和反序列化的原因:
这是一个普通的java类
在 Java 中实现了 Serializable 接口后, JVM 会在底层帮我们实现序列化和反序列化, 如果我们不实现 Serializable 接口, 那自己去写一套序列化和反序列化代码也行。
序列化:
上面说到必须实现Serializable接口,我们不实现这个接口试一下:修改Person.java代码去掉implements Serializable:运行SerializationTest.java:
反序列化:
用transient关键字修饰该属性来阻止被序列化:把Person.java中的private String name;修改成private transient String name;
可以看到name属性无法被反序列化了。
反序列化漏洞原因
反序列化的自动执行特性:Java反序列化的过程中,对象的构造(readObject()方法)和内部数据的还原是自动触发的,无需开发者调用。
如果反序列化的类重写了readObject()方法,该方法会在反序列化时自动执行,成为攻击入口
反序列化漏洞代码详解
重写readObject()方法
成功执行命令: