闲来无事(一)

33 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

左边的情况可以理解为右边的封装 正常情况下,forname的第一个参数是类名,第二个参数表示是否初始化,第三个参数就是classLoader(这是一个加载器,它告诉java虚拟机如何加载这个类)。

forName 中的 initialize=true 其实就是告诉Java虚拟机是否执⾏”类初始化“本文已参与「新人创作礼」活动,一起开启掘金创作之路

首先我们要知道java反序列化和php反序列化以及python反序列化的区别

java的反序列化和PHP的反序列化有些类似,都是为了方便数据的存储,将一个对象中的属性按照某种特定的格式生成一段数据流,在反序列化的时候再按照这个格式将属性拿出来,再赋值给新的对象

java在序列化一个对象时,将会调用这个对象中的writeObject方法,参数类型是ObjectOutputstream,开发者可以将任何内容写入到这个stream中、

反序列化时会调用readObject,可以从其中读取去前面写入的内容

package H0ne;

import java.io.IOException;

public class hello implements java.io.Serializable {
    public String name;
    public int age;
    hello(String name, int age) {
        this.name = name;
        this.age = age;
    }
    private void writeObject(java.io.ObjectOutputStream s) throws
            IOException {
        s.defaultWriteObject();
        s.writeObject("This is a object");
    }
    private void readObject(java.io.ObjectInputStream s)
            throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        String message = (String) s.readObject();
        System.out.println(message);
    }
    }

在执行s.defaultwriteObject()后,在stream中有一个字符串this is a project 然后在反序列化的时候,通过readobject将其读出。

在JAVA的反序列化会发现,通过writeObject将其写入,然后readObject将其取出。并没有像PHP一个魔术方法只出现一两次。java的是多次出现

下面我们要引入一个工具,ysoserial
这个工具可以生成poc

java -jar ysoserial-master-30099844c6-1.jar CommonsCollections1 "id"

将生成好的POC发送给目标,如果目标存在反序列化漏洞,并满足这个gadget对应的条件,呢么命令id将被执行

URLDNS参数不是一个可以利用的命令,只是一个URL,其能触发的结果也不是命令执行。而是一次DNS请求

这个利用适合我们在检测反序列化漏洞的时候用
使用java内置的类构造,对第三方库没有依赖
在目标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞