理解反序列化漏洞原理
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
反序列化漏洞一直搞不明白,所以今天特意翻出很久未動(dòng)的java,學(xué)習(xí)了一下序列化。
簡單來說,序列化可以理解為就是將對(duì)象轉(zhuǎn)化為字節(jié)流,字節(jié)流中包括這個(gè)對(duì)象的數(shù)據(jù)和信息,序列化和反序列化便于類的持久保存,并且很利于網(wǎng)絡(luò)傳輸。在面向?qū)ο蟮木幊讨?,都?huì)涉及到序列化和反序列化,像java中,有一個(gè)接口Serializable,用來實(shí)現(xiàn)java序列化,php中也有Serializable方法來實(shí)現(xiàn)php序列化。這里我寫了一個(gè)java的序列化。
下面是一個(gè)student類,為實(shí)現(xiàn)序列化,需要繼承Serializable接口
import java.io.Serializable;
public class student implements Serializable {
private String name;
private String age;
public void setAge(String age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
然后我在main函數(shù)中實(shí)現(xiàn)序列化。通過流,將一個(gè)名為s的student類 序列化,并將其存到Student.ser文件中
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class run {
public static void main(String[] args) {
student s = new student();
s.setAge("21");
s.setName("Hileaf");
try {
FileOutputStream fileOut = new FileOutputStream("Student.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(s);
out.close();
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
運(yùn)行后,序列化過的s如下:

我們不用關(guān)心亂碼。我們這里把字節(jié)流存入到ser文件中,并且,這條字節(jié)流也可以保存在內(nèi)存、數(shù)據(jù)庫中。
而反序列化,就是通過這條字節(jié)流的數(shù)據(jù)和信息,將它還原成一個(gè)類。這里我們字節(jié)流沒有任何過濾,也就是說,我們?cè)趎ew一個(gè)新的類時(shí),內(nèi)容是用戶可控的,即字節(jié)流就是用戶可控的。
那么這樣,就容易理解反序列化漏洞了。
如果Java應(yīng)用對(duì)用戶輸入(即不可信數(shù)據(jù))做了反序列化處理,那么攻擊者可以通過構(gòu)造惡意輸入,讓反序列化產(chǎn)生非預(yù)期的類或?qū)ο?,這個(gè)類或?qū)ο笤诋a(chǎn)生過程中就有可能帶來任意代碼執(zhí)行。
所以這個(gè)問題的根源在于,字節(jié)流進(jìn)行還原時(shí),即用到ObjectInputStream在反序列化時(shí),沒有對(duì)生成的對(duì)象的類型做限制。這就是java反序列化漏洞的原理,php和Python也基本相同。
————————————————
版權(quán)聲明:本文為CSDN博主「Hileaf」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/qq_50620293/article/details/114982372
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
??????

??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
