您好,歡迎來(lái)到賦能網(wǎng)!

java序列化漏洞搭建怎么弄?

賦能網(wǎng) 2023-05-09 70

在現(xiàn)有很多的應(yīng)用當(dāng)中,需要對(duì)某些對(duì)象進(jìn)行序列化,讓它們離開(kāi)內(nèi)存空間,入駐物理硬盤,以便可以長(zhǎng)期保存,那么java序列化漏洞搭建怎么弄?今天我們就來(lái)講解一下。

Java序列化是Java 提供了一種對(duì)象序列化的機(jī)制,該機(jī)制中,一個(gè)對(duì)象可以被表示為一個(gè)字節(jié)序列,該字節(jié)序列包括該對(duì)象的數(shù)據(jù)、有關(guān)對(duì)象的類型的信息和存儲(chǔ)在對(duì)象中數(shù)據(jù)的類型。

漏洞基本原理

簡(jiǎn)單的反序列化Demo

首先定義對(duì)象類Persion,包含兩個(gè)參數(shù)

public class implements java.io.Serializable
{
    public String name;
    public int age;
    public void info()
    {
        System.out.println("Name:" + this.name + ";nAge:" + this.age);
    }
}

在主類中聲明對(duì)象,并且將對(duì)象序列化為二進(jìn)制文件,將其存儲(chǔ)到硬盤中

import java.io.*;
public class Main
{
    public static void main(String[] args)
        {

將對(duì)象序列化為二進(jìn)制文件

Persion p = new Persion();
p.name = "Joner";
p.age = 18;
try
{
    //打開(kāi)一個(gè)文件輸入流
    FileOutputStream fileOut = new FileOutputStream("D:\test\test.db");
    //建立對(duì)象輸入流
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    //輸出反序列化對(duì)象
    out.writeObject(p);
    out.close();
    fileOut.close();
    System.out.printf("保存成功");
}
catch (IOException i)
{
    i.printStackTrace();
}
}

進(jìn)行反序列化

import java.io.*;
public class Main
{
    public static void main(String[] args)
    {
        
        Persion persion = null;
        try
        {
            FileInputStream fileInputStream = new FileInputStream("D:\test\test.db");
            //建立對(duì)象輸入流
            ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
            persion = (Persion) inputStream.readObject();
            inputStream.close();
            fileInputStream.close();
        }
        catch (ClassNotFoundException c)
        {
            System.out.println("對(duì)象未找到");
            c.printStackTrace();
            return;
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            return;
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return;
        }
        System.out.println("反序列化對(duì)象.......");
        System.out.println("Name:" + persion.name);
        System.out.println("Age:" + persion.age);
    }
}

查看test.db文件的內(nèi)容可以看見(jiàn)如下內(nèi)容

其中 AC ED 00 05 是java 序列化內(nèi)容的特征,其中00 05 是版本信息,base64編碼后為ro0AB

反序列化漏洞Demo

在上面的Demo中可以看到,進(jìn)行反序列化時(shí)會(huì)調(diào)用readObject()方法,如果readObject方法書(shū)寫不當(dāng)就會(huì)引發(fā)漏洞。

import java.io.*;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        Unsafeclass unsafeclass = new Unsafeclass();
        unsafeclass.name = "hhhhh";
        FileOutputStream fileOutputStream = new FileOutputStream("object");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //將對(duì)象寫入object文件
        objectOutputStream.writeObject(unsafeclass);
        objectOutputStream.close();
        //從文件中反序列化對(duì)象
        FileInputStream fileInputStream = new FileInputStream("object");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        //恢復(fù)對(duì)象
        Unsafeclass objectFormDisk = (Unsafeclass) objectInputStream.readObject();
        System.out.println(objectFormDisk.name);
        objectOutputStream.close();
    }
}
class Unsafeclass implements Serializable
{
    public String name;
    //重寫readObject()方法
    private void readObject(java.io.ObjectInputStream inputStream) throws IOException, ClassNotFoundException
    {
        //執(zhí)行默認(rèn)的readObdect()方法
        inputStream.defaultReadObject();
        //執(zhí)行打開(kāi)計(jì)算器命令
        Runtime.getRuntime()
            .exec("calc.exe");
    }
}

程序運(yùn)行過(guò)程為:

UnsafeClass類背序列化進(jìn)入object文件;

從object文件中恢復(fù)對(duì)象;

調(diào)用被恢復(fù)對(duì)象的readObject()方法;

命令被執(zhí)行;

這樣看感覺(jué)并不會(huì)有人會(huì)這樣寫readobject()這個(gè)方法,而且一些成熟的框架都會(huì)有防范反序列化的方法,但仍有很大比例的反序列化漏洞,這主要是使用了不安全的庫(kù)造成的。

java序列化的知識(shí)在實(shí)際工作中是一個(gè)重點(diǎn),作為java人員要將這方面的知識(shí)熟悉運(yùn)用,才能在實(shí)際工作中合理的解決問(wèn)題!最后大家如果想要了解更多java初識(shí)知識(shí),敬請(qǐng)關(guān)注賦能網(wǎng)。


本文鏈接:

本文章“java序列化漏洞搭建怎么弄?”已幫助 70 人

免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識(shí)產(chǎn)權(quán)侵權(quán)的法律責(zé)任!

本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開(kāi)班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579

如果本頁(yè)不是您要找的課程,您也可以百度查找一下: