serialize() //將乙個物件轉換成乙個字串
unserialize() //將字串還原成乙個物件
通過序列化與反序列化我們可以很方便的在php中進行物件的傳遞。本質上反序列化是沒有危害的。但是如果使用者對資料可控那就可以利用反序列化構造payload攻擊。
__construct()//建立物件時觸發
__destruct() //物件被銷毀時觸發
__call() //在物件上下文中呼叫不可訪問的方法時觸發
__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發
__get() //用於從不可訪問的屬性讀取資料
__set() //用於將資料寫入不可訪問的屬性
__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__invoke() //當指令碼嘗試將物件呼叫為函式時觸發
__sleep()
serialize() 函式會檢查類中是否存在乙個魔術方法 __sleep()。如果存在,該方法會先被呼叫,然後才執行序列化操作。此功能可以用於清理物件,並返回乙個包含物件中所有應被序列化的變數名稱的陣列。如果該方法未返回任何內容,則 null 被序列化,並產生乙個 e_notice 級別的錯誤。
物件被序列化之前觸發,返回需要被序列化儲存的成員屬性,刪除不必要的屬性。
__wakeup()
unserialize() 會檢查是否存在乙個 __wakeup() 方法。如果存在,則會先呼叫 __wakeup 方法,預先準備物件需要的資源。
__wakeup()函式用法:
wakeup()是用在反序列化操作中。unserialize()會檢查存在乙個wakeup()方法。如果存在,則先會呼叫__wakeup()方法。
<?php
class a}$c
= new a();
$d=unserialize(
'o:1:"a":0:{}');
?>
最後頁面輸出了hello。在反序列化的時候存在__wakeup()函式,所以最後就會輸出hello。
__wakeup()函式漏洞說明:
<?php
class student
}$s = new student();
var_dump(serialize($s));
?>
最後頁面上輸出的就是student物件的乙個序列化輸出:
o:7:"student":3:}
其中在stuedent類後面有乙個數字3,整個3表示的就是student類存在3個屬性。
wakeup()漏洞就是與整個屬性個數值有關。當序列化字串表示物件屬性個數的值大於真實個數的屬性時就會跳過wakeup的執行。
當我們將上述的序列化的字串中的物件屬性個數修改為5,變為
o:7:"student":5:
}
最後執行執行的**如下:
class student
function __destruct()
}$s = new student();
$stu = unserialize('o:7:"student":5:}');
這樣就成功地繞過了__wakeup()函式。
例子:
<?php
class xctf
}$test = new xctf(); //使用new運算子來例項化該類(xctf)的物件為test
echo(serialize($test)); //輸出被序列化的物件(test)
?>
執行結果
o:4:「xctf」:1:,要反序列化xctf類的同時還要繞過wakeup方法的執行,如果不繞過就會輸出bad requests並退出。
修改:
php反序列漏洞 例項 PHP反序列化漏洞
雖然胳膊廢了,也不能停止我更新的腳步。寫個簡單點的吧 0x00 何為類和物件 說到序列化和反序列化就不得不提到兩個詞 類和物件 那麼什麼是類,什麼是物件 教科書式的答案是類是物件的抽象,物件是類的例項 那啥叫個抽象,啥叫個例項呢 簡單的說,類就是物件的乙個標準模板,而物件就是按照模板做出來的實物 一...
PHP反序列化漏洞
序列化簡單利用 serialize 序列化 使用函式serialize 可將例項序列化為字串 unserialize 反序列化 使用函式unserialize 可將序列化的字串還原 示例 class example unserialize get code 漏洞利用 構造漏洞利用的 儲存為test....
PHP反序列化漏洞
前幾天安恆月賽兩道web題中有一道題是關於php反序列化的,然後剛好前幾天剛好看過這個知識點,於是乎這次比賽才沒有爆零,總算是寫出來了一道題 doge 所有php裡面的值都可以使用函式serialize 來返回乙個包含位元組流的字串來表示。unserialize 函式能夠重新把字串變回php原來的值...