早就想學java安全,但一直無從下手,今天下定決心好好學習,當然以下內容可能會有些許錯誤,小白的煩惱,
序列化與反序列化
Java序列化是指把Java物件轉換為位元組序列的程序;而Java反序列化是指把位元組序列恢復為Java物件的程序,
序列化分為兩大部分:序列化和反序列化,序列化是這個程序的第一部分,將資料分解成位元組流,以便存盤在檔案中或在網路上傳輸,反序列化就是打開位元組流并重構物件,物件序列化不僅要將基本資料型別轉換成位元組表示,有時還要恢復資料,恢復資料要求有恢復資料的物件實體,
為什么需要序列化與反序列化
我們知道,當兩個行程進行遠程通信時,可以相互發送各種型別的資料,包括文本、圖片、音頻、視頻等, 而這些資料都會以二進制序列的形式在網路上傳送,那么當兩個Java行程進行通信時,能否實作行程間的物件傳送呢?答案是可以的,如何做到呢?這就需要Java序列化與反序列化了,換句話說,一方面,發送方需要把這個Java物件轉換為位元組序列,然后在網路上傳送;另一方面,接收方需要從位元組序列中恢復出Java物件,
當我們明晰了為什么需要Java序列化和反序列化后,我們很自然地會想Java序列化的好處,其好處一是實作了資料的持久化,通過序列化可以把資料永久地保存到硬碟上(通常存放在檔案里),二是,利用序列化實作遠程通信,即在網路上傳送物件的位元組序列,
① 想把記憶體中的物件保存到一個檔案中或者資料庫中時候;② 想用套接字在網路上傳送物件的時候;③ 想通過RMI傳輸物件的時候
為什么會產生安全問題?
只要服務端反序列化資料,客戶端傳遞類的readObject中代碼會自動執行,給予攻擊者在服務器上運行代碼的能力,
幾種常見的序列化和反序列化協議
XML&SOAP
JSON
Protobuf
理解
類比快遞、打包和拆包
有些快遞打包和拆包時有獨特需求、比如易碎朝上,類比重寫writeObject和readObject
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
實體
Java反序列化的操作,很多是需要開發者深入參與的,所以你會發現大量的庫會實作readObject 、writeObject 方法,這和PHP中__wakeup 、__sleep 很少使用是存在鮮明對比的,我在《Java安全漫談 - 06.RMI篇(3)》的最后一部分,講到了classAnnotations ,這次再來說說objectAnnotation ,Java在序列化時一個物件,將會呼叫這個物件中的writeObject 方法,引數型別是ObjectOutputStream ,開發者可以將任何內容寫入這個stream中;反序列化時,會呼叫readObject ,開發者也可以從中讀取出前面寫入的內容,并進行處理,
創建一個person類
import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; ? public class Person implements Serializable { private String name; private int age; public Person(){} public Person(String name,int age){ this.name=name; this.age=age; } ? @Override public String toString() { return "Person{"+ "name='" + name + "\'" + ",'age=" + age + '}'; } }
創建一個序列化類
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; ? public class SerializationTest { public static void serialize(Object obj) throws IOException { ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("ser.bin")); oos.writeObject(obj); } public static void main(String[] args) throws Exception{ Person person=new Person("xinyuan",22); serialize(person); System.out.println(person); } }
創建一個反序列化類
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; ? public class UnserializationTest { public static Object unserialize(String Filename) throws IOException, ClassNotFoundException { ObjectInputStream ois=new ObjectInputStream(new FileInputStream("ser.bin")); Object obj = ois.readObject(); return obj; } public static void main(String[] args) throws Exception{ Person person=(Person) unserialize("ser.bin"); System.out.println(person); } }
可能的形式
1.入口類的readObject直接呼叫危險方法


在person類,重寫readObject方法,序列化后,反序列化

2.入口類引數中包含可控類,該類有危險方法,readObject時呼叫,
3.入口類引數包含可控類,該類又呼叫其他有危險方法的類,readObject時呼叫
條件
共同條件 繼承Serializable
入口類 source(重寫readObject 引數型別寬泛 最好jdk自帶) Map<Object ,Object>
呼叫鏈 gadget chain 相同名稱,相同型別
執行類 sink(rce ssrf 寫檔案等等)
https://github.com/frohoff/ysoserial/
更多靶場實驗練習、網安學習資料,請點擊這里>>搜索
復制
合天智匯:合天網路靶場、網安實戰虛擬環境轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/508106.html
標籤:其他
