java安全学习-第三天(不安全的反序列化1)
0x01、前言
本章节是在上学期间抽空写的,就打算随便写的
估计全是太平洋,象征性的总结下知识点
看了一下MS08067写的java安全书,蛮不错的,但感觉跟p牛的文章,还差点意思
接下来还是跟着两位大佬的脚步走吧
0x02、开始水
readobject()是反序列化的入口
writeobject()是序列化的入口
一个类要想被序列化操作,必须继承Serialize接口或是其父类
我们首先来看看RMI
RMI
What is RMI?
RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的。
其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用
但要注意,RMI中的对象是通过序列化方式进行编码传输的,这意味着。接收后会对其进行反序列化。可作为反序列化链子的触发点
先来看个小例子
import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.io.IOException;public class rat{public static void main(String[] args) throws Exception {try{Registry registry = LocateRegistry.createRegistry(1088);System.out.println("127.0.0.1:1088");while(true);}catch (Exception e){e.printStackTrace();}}}
这里是使用了书中的代码,但很可惜,因为版本原因,攻击失败了

看到这是不是一头雾水?我也是
此篇只是象征性的蜻蜓点水罢了
反序列化
有点偷懒,开始本来就想抄p牛的demo复现一下,但抄完后,发现死活运行不起来
没办法,只好重头开始学习java的反序列化
前提
如果要把一个类序列化,那么这个类应该实现Serializable接口或者Externalizable接口之一。
例如
public class Person implements java.io.Serializable{// ...}
How to 序列化/反序列化?
1.
**步骤一:创建一个ObjectOutputStream输出流;****步骤二:调用ObjectOutputStream对象的writeObject()输出可序列化对象。**
2.
**步骤一:创建一个ObjectInputStream输入流;****步骤二:调用ObjectInputStream对象的readObject()得到序列化的对象。**
上代码,Person类则是运用了p牛的demo
import java.io.*;public class Main {public static void main(String[] args) throws Exception {//创建一个ObjectOutputStream输出流ObjectOutputStream x=new ObjectOutputStream(new FileOutputStream("x.bin"));//将对象序列化到文件x.writeObject(new Person("rat", 18));x.close();//将文件中的内容反序列化成对象Object a=new ObjectInputStream(new FileInputStream("x.bin")).readObject();}}

PS:手动感谢pic前辈
如果单纯的运行p牛的demo,是跑不起来的
0x03、小结
这篇笔记比较水,但反序列化这个点确实弄了我一个下午,花了不少时间qwq😊
本人写的的确不太详细,关于反序列化,大家可以看以下资料
