終身高級VIP會員
  
- 資源幣
- 11472
- 積分
- 4971
- 貢獻
- 0
- 在線時間
- 2065 小時
- 注冊時間
- 2015-4-20
- 最后登錄
- 2024-7-9

|
PHP反序列化漏洞代碼審計1、什么是序列化
A、PHP網(wǎng)站的定義:
所有php里面的值都可以使用函數(shù)serialize()來返回一個包含字節(jié)流的字符串來表示。unserialize()函數(shù)能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。
按個人理解就是:
serialize()將一個對象轉(zhuǎn)換成一個字符串,unserialize()將字符串還原為一個對象。
當(dāng)然從本質(zhì)上來說,反序列化的數(shù)據(jù)本身是沒有危害的,用戶可控數(shù)據(jù)進行反序列化是存在危害的。
B、PHP反序列化
php允許保存一個對象方便以后重用,這個過程被稱為序列化。為什么要有序列化這種機制呢?在傳遞變量的過程中,有可能遇到變量值要跨腳本文件傳遞的過程。試想,如果為一個腳本中想要調(diào)用之前一個腳本的變量,但是前一個腳本已經(jīng)執(zhí)行完畢,所有的變量和內(nèi)容釋放掉了,我們要如何操作呢?難道要前一個腳本不斷的循環(huán),等待后面腳本調(diào)用?這肯定是不現(xiàn)實的。因為這樣的操作,在小項目還好,在大項目里是極其浪費資源的。但是如果你將一個對象序列化,那么它就會變成一個字符串,等你需要的時候再通過反序列化轉(zhuǎn)換回變了變量,在進行調(diào)用就好了,在這樣就剩了資源的使用。
2、理解PHP反序列化漏洞
PHP類中有一種特殊函數(shù)體的存在叫魔法函數(shù),magic函數(shù)命名是以符號__開頭的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。這些函數(shù)在某些情況下會自動調(diào)用,比如__construct當(dāng)一個對象創(chuàng)建時被調(diào)用,__destruct當(dāng)一個對象銷毀時被調(diào)用,__toString當(dāng)一個對象被當(dāng)作一個字符串使用。
而在反序列化時,如果反序列化對象中存在魔法函數(shù),使用unserialize()函數(shù)同時也會觸發(fā)。這樣,一旦我們能夠控制unserialize()入口,那么就可能引發(fā)對象注入漏洞。
3、PHP反序列化漏洞利用的前提
a.unserialize()函數(shù)的參數(shù)可控;
b.php文件中存在可利用的類,類中有魔術(shù)方法
|
|