php 序列化與魔術方法 wakeup ,

2021-10-02 07:22:32 字數 966 閱讀 7230

一、介紹

這兩個方法是在物件的序列化與反串行話裡使用的,當序列化serialize物件時,可以把物件裡的屬性和方法轉換成連續的bytes資料,儲存在乙個檔案裡或者在網路上傳輸,當需要使用這個物件時,就可以反串行話unserialize這個字串,得到這個物件,然後繼續使用。

當對乙個物件序列化時,php就會呼叫__sleep方法(如果存在的話),在反序列化時,php就會呼叫__wakeup方法(如果存在的話)。__sleep這個方法可以用於清理物件,並返回乙個包含物件中所有變數名稱的陣列。如果該方法不返回任何內容,則null被序列化,導致乙個e_notice錯誤。在反序列化unserialize時,會檢查是否存在__wakeup方法,如果存在,則會呼叫__wakeup方法,預先準備物件資料。

__sleep() 方法常用於提交未提交的資料,或類似的清理操作。同時,如果有一些很大的物件,但不需要全部儲存,這個功能就很好用。__wakeup 經常用在反序列化操作中,例如重新建立資料庫連線,或執行其它初始化操作。

二、__wakeup()函式漏洞

1. _wakeup()執行漏洞:乙個字串或物件被序列化後,如果其屬性被修改,則不會執行__wakeup()函式。

2.通過精心構造poc,還可以通過反序列化控制例項物件中屬性的內容,從而實現**執行。(詳見:freebuf專欄)

更多詳細解釋移步freebuf:

三、關於利用

一般都是對乙個已例項化的物件中的內容需要儲存,為了節省開發成本,選擇序列化之後儲存該序列化字串,等到後面使用的時候,再恢復為物件例項。類似json的序列化!

序列化之後的結果就是一串字串,在恢復的時候,會檢測其屬性個數與類模板中的型別個數是否相同,型別不同,屬性增多都會導致反序列化失敗,也就是不執行魔術函式。

因此,可以構造序列化內容,修改其中屬性型別或個數,從而進行繞過對應的magic函式。來拿到flag

四、注意

屬性:指的是變數,包括字串,類,陣列,數字等等。 不包括函式!!!

php序列化與反序列化

php的序列化 反序列化對與一些大檔案的壓縮操作,讀寫操作十分有用。乙個簡單的序列化案例 同時用到了序列化與反序列化函式,二者在被呼叫時會分別自己呼叫對應的函式,sleep 以及 wakeup.sleep和 wakeup練習題 故事 乙個果農生產了很多水果種類,於是需要把乙個買家指定的種類寄給他,生...

php 序列化與反序列化

序列化 反序列化序列化 例一class user number 66 str jerry bool true null null arr array a 1,b 2 user new user tom true var dump serialize number var dump serialize...

php序列化與非序列化

講的超詳細 重點摘抄 1 序列化物件時,不會儲存常量的值。對於父類中的變數,則會保留。2 當呼叫serialize 函式序列化物件時,該函式會檢查類中是否存在乙個魔術方法 sleep 如果存在,該方法會先被呼叫,然後才執行序列化操作。可以通過過載這個方法,從而自定義序列化行為。3 若被反序列化的變數...