反序列化漏洞:
? ? 序列化:就是把一個(gè)對(duì)象變成字符串夸浅,目的就是為了方便傳輸冤荆,或者保存在內(nèi)存踊沸,文件(可以節(jié)省內(nèi)存空間)歇终,數(shù)據(jù)庫中。
? ? 反序列化:就是把被序列化的字符串還原為對(duì)象,然后在接下來的代碼中繼續(xù)使用逼龟。
? ? 反序列化漏洞產(chǎn)生的原理:序列化和反序列化本身沒有問題,但是如果反序列化的內(nèi)容是用戶可以控制的,且后臺(tái)不正當(dāng)?shù)氖褂昧四Хê瘮?shù),那么用戶就可以注入精心構(gòu)造的 payload评凝。當(dāng)進(jìn)行反序列化或者對(duì)象銷毀時(shí)候就有可能會(huì)觸發(fā)對(duì)象中的一些魔術(shù)方法,造成意想不到的危害腺律。
? ? 魔法函數(shù)有:
? ??construct()當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí)被調(diào)用
????destruct()當(dāng)一個(gè)對(duì)象銷毀時(shí)被調(diào)用
????toString()將一個(gè)對(duì)象轉(zhuǎn)換成一個(gè)字符串使用
????sleep() 對(duì)象序列化之前被調(diào)用
????wakeup()反序列化之前被調(diào)用
不同語言對(duì)應(yīng)的序列化和反序列化函數(shù):
? ? php: serialize()奕短,unserialize()
? ? java:ObjectOutputStream.writeObject()方法可以實(shí)現(xiàn)序列化,ObjectInputStream.readObject()方法用于反序列化.
防護(hù):
? ??嚴(yán)格控制傳入變量匀钧,嚴(yán)謹(jǐn)使用魔法函數(shù)
要點(diǎn):
? ??序列化時(shí)翎碑,只對(duì)對(duì)象的屬性進(jìn)行保存,而不管對(duì)象的方法
? ? 遇到過Weblogic之斯,jboss,struts2的反序列化漏洞日杈。