关于JAVA反序列化你需要知道的一些事
什么是序列化?反序列化?
- 简单了解什么叫序列化&反序列化
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。 - 为什么要序列化再反序列化呢?
一句话解释:为了数据传输呗【将对象转成二进制的字节序列才能在网络上传】
JAVA怎么做到序列化和反序列化的?
主流的方式就是利用函数接口。
看一个具体的例子
。
private static void serialPerson() throws IOException {
Person person = new Person("Zhangsan", 100, "妖", 101);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File("d:/person.txt"))
);
oos.writeObject(person);
System.out.println("person 对象序列化成功!");
oos.close();
}
我们把 Person 类,保存到person.txt记事本中,通过 FileOutputStream 方法进行保存。这里就默认进行了序列化操作。
我们用 winhex 来查看一下person.txt。
后序,当接受到此序列化字符时,再调用FileInputStream 方法读数据,并且进行反序列化就能够正确识别文本信息了
private static Person deserialPerson() throws Exception {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("d:/person.txt"))
);
Person person = (Person)ois.readObject();
System.out.println("person 对象反序列化成功!");
//Runtime.getRuntime().exec("calc.exe");
return person;
}
小结
其实就很像一个编码,解码的过程。可以类比 ,url编码,url解码。
JAVA识别序列化
我们需要在看到一些字符串的时候,至少能够识别这是序列化的数据。
反序列化存在的安全问题
那么问题来了,这么好的一个功能为什么就会存在安全问题呢?
思路很简单,如果上述的person.txt文本,人为可控,那么就可以做到RCE了
Webgoat 靶场案例
webgoat 第八关,不安全的反序列化
这里submit就是提交序列化脚本,然后靶场会对序列化脚本进行反序列化。
这里我们尝试进行一次RCE
Step1:通过白盒审计,知道webgoat 第八关的构建时。引入了 Hibernate1依赖
Step2:利用工具 ysoserial 1生成一个打开计算器的payload。
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "calc.exe" > x.bin
Step3:payload进行base64编码
Step4:Exploit:复制编码后的数据,输入submit。
https://github.com/angelwhu/ysoserial ↩︎