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中的对象是通过序列化方式进行编码传输的,这意味着。接收后会对其进行反序列化。可作为反序列化链子的触发点

先来看个小例子

  1. import java.rmi.registry.LocateRegistry;
  2. import java.rmi.registry.Registry;
  3. import java.io.IOException;
  4. public class rat{
  5. public static void main(String[] args) throws Exception {
  6. try{
  7. Registry registry = LocateRegistry.createRegistry(1088);
  8. System.out.println("127.0.0.1:1088");
  9. while(true);
  10. }
  11. catch (Exception e){
  12. e.printStackTrace();
  13. }
  14. }
  15. }

这里是使用了书中的代码,但很可惜,因为版本原因,攻击失败了

1.png

看到这是不是一头雾水?我也是

此篇只是象征性的蜻蜓点水罢了

反序列化

有点偷懒,开始本来就想抄p牛的demo复现一下,但抄完后,发现死活运行不起来

没办法,只好重头开始学习java的反序列化

前提

如果要把一个类序列化,那么这个类应该实现Serializable接口或者Externalizable接口之一。

例如

  1. public class Person implements java.io.Serializable{
  2. // ...
  3. }

How to 序列化/反序列化?

1.

  1. **步骤一:创建一个ObjectOutputStream输出流;**
  2. **步骤二:调用ObjectOutputStream对象的writeObject()输出可序列化对象。**

2.

  1. **步骤一:创建一个ObjectInputStream输入流;**
  2. **步骤二:调用ObjectInputStream对象的readObject()得到序列化的对象。**

上代码,Person类则是运用了p牛的demo

  1. import java.io.*;
  2. public class Main {
  3. public static void main(String[] args) throws Exception {
  4. //创建一个ObjectOutputStream输出流
  5. ObjectOutputStream x=new ObjectOutputStream(new FileOutputStream("x.bin"));
  6. //将对象序列化到文件
  7. x.writeObject(new Person("rat", 18));
  8. x.close();
  9. //将文件中的内容反序列化成对象
  10. Object a=new ObjectInputStream(new FileInputStream("x.bin")).readObject();
  11. }
  12. }

2.png

PS:手动感谢pic前辈

如果单纯的运行p牛的demo,是跑不起来的

0x03、小结

这篇笔记比较水,但反序列化这个点确实弄了我一个下午,花了不少时间qwq😊

本人写的的确不太详细,关于反序列化,大家可以看以下资料

https://zhuanlan.zhihu.com/p/449460157

https://www.runoob.com/java/java-serialization.html