反序列化漏洞:
? ? 序列化:就是把一個(gè)對象變成字符串,目的就是為了方便傳輸,或者保存在內(nèi)存,文件(可以節(jié)省內(nèi)存空間),數(shù)據(jù)庫中。
? ? 反序列化:就是把被序列化的字符串還原為對象,然后在接下來的代碼中繼續(xù)使用。
? ? 反序列化漏洞產(chǎn)生的原理:序列化和反序列化本身沒有問題,但是如果反序列化的內(nèi)容是用戶可以控制的,且后臺不正當(dāng)?shù)氖褂昧四Хê瘮?shù),那么用戶就可以注入精心構(gòu)造的 payload。當(dāng)進(jìn)行反序列化或者對象銷毀時(shí)候就有可能會觸發(fā)對象中的一些魔術(shù)方法,造成意想不到的危害。
? ? 魔法函數(shù)有:
? ??construct()當(dāng)一個(gè)對象創(chuàng)建時(shí)被調(diào)用
????destruct()當(dāng)一個(gè)對象銷毀時(shí)被調(diào)用
????toString()將一個(gè)對象轉(zhuǎn)換成一個(gè)字符串使用
????sleep() 對象序列化之前被調(diào)用
????wakeup()反序列化之前被調(diào)用
不同語言對應(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í),只對對象的屬性進(jìn)行保存,而不管對象的方法
? ? 遇到過Weblogic,jboss,struts2的反序列化漏洞。