美文网首页漏洞分析
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