在現(xiàn)有很多的應(yīng)用當中,需要對某些對象進行序列化,讓它們離開內(nèi)存空間,入駐物理硬盤,以便可以長期保存,那么java序列化漏洞搭建怎么弄?今天我們就來講解一下。
Java序列化是Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節(jié)序列,該字節(jié)序列包括該對象的數(shù)據(jù)、有關(guān)對象的類型的信息和存儲在對象中數(shù)據(jù)的類型。
漏洞基本原理
簡單的反序列化Demo
首先定義對象類Persion,包含兩個參數(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); } }
在主類中聲明對象,并且將對象序列化為二進制文件,將其存儲到硬盤中
import java.io.*; public class Main { public static void main(String[] args) {
將對象序列化為二進制文件
Persion p = new Persion(); p.name = "Joner"; p.age = 18; try { //打開一個文件輸入流 FileOutputStream fileOut = new FileOutputStream("D:\test\test.db"); //建立對象輸入流 ObjectOutputStream out = new ObjectOutputStream(fileOut); //輸出反序列化對象 out.writeObject(p); out.close(); fileOut.close(); System.out.printf("保存成功"); } catch (IOException i) { i.printStackTrace(); } }
進行反序列化
import java.io.*; public class Main { public static void main(String[] args) { Persion persion = null; try { FileInputStream fileInputStream = new FileInputStream("D:\test\test.db"); //建立對象輸入流 ObjectInputStream inputStream = new ObjectInputStream(fileInputStream); persion = (Persion) inputStream.readObject(); inputStream.close(); fileInputStream.close(); } catch (ClassNotFoundException c) { System.out.println("對象未找到"); c.printStackTrace(); return; } catch (FileNotFoundException e) { e.printStackTrace(); return; } catch (IOException e) { e.printStackTrace(); return; } System.out.println("反序列化對象......."); System.out.println("Name:" + persion.name); System.out.println("Age:" + persion.age); } }
查看test.db文件的內(nèi)容可以看見如下內(nèi)容
其中 AC ED 00 05 是java 序列化內(nèi)容的特征,其中00 05 是版本信息,base64編碼后為ro0AB
反序列化漏洞Demo
在上面的Demo中可以看到,進行反序列化時會調(diào)用readObject()方法,如果readObject方法書寫不當就會引發(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); //將對象寫入object文件 objectOutputStream.writeObject(unsafeclass); objectOutputStream.close(); //從文件中反序列化對象 FileInputStream fileInputStream = new FileInputStream("object"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); //恢復(fù)對象 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í)行默認的readObdect()方法 inputStream.defaultReadObject(); //執(zhí)行打開計算器命令 Runtime.getRuntime() .exec("calc.exe"); } }
程序運行過程為:
UnsafeClass類背序列化進入object文件;
從object文件中恢復(fù)對象;
調(diào)用被恢復(fù)對象的readObject()方法;
命令被執(zhí)行;
這樣看感覺并不會有人會這樣寫readobject()這個方法,而且一些成熟的框架都會有防范反序列化的方法,但仍有很大比例的反序列化漏洞,這主要是使用了不安全的庫造成的。
java序列化的知識在實際工作中是一個重點,作為java人員要將這方面的知識熟悉運用,才能在實際工作中合理的解決問題!最后大家如果想要了解更多java初識知識,敬請關(guān)注賦能網(wǎng)。
本文鏈接:
本文章“java序列化漏洞搭建怎么弄?”已幫助 70 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開班》學(xué)校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579