序列化就是將乙個物件轉換成字串。字串包括 屬性名 屬性值 屬性型別和該物件對應的類名。
反序列化則相反將字串重新恢復成物件
物件的序列化利於物件的儲存和傳輸,也可以讓多個檔案共享物件。
ctf很多題型也都是考察php反序列化的相關知識
序列化函式serialize()
首先我創乙個ctf類 裡面寫了三個屬性 後建立了乙個ctfer物件 將ctf類裡的資訊進行了改變。如果後面還要用到這個物件,就可以先將這個物件進行例項化。用的時候在反序列化出來就ok了
o:3:"ctf":3";s:4:"name";s:7:"sch0lar";s:3:"age";s:2:"18";}
o代表物件 因為我們序列化的是乙個物件 序列化陣列則用a來表示
3 代表類名字佔三個字元
ctf 類名
3 代表三個屬性
s代表字串
4代表屬性名長度
flag屬性名
s:13:"flag" 字串 屬性值長度 屬性值
serialize() 函式會檢查類中是否存在乙個魔術方法sleep()。如果存在,sleep()方法會先被呼叫,然後才執行序列化操作。
可以再__sleep()方法裡可以決定哪些屬性被序列化
如果沒有__sleep()方法則預設序列化所有屬性
上圖__sleep()方法使flag age 屬性序列化 name並沒有被序列化
根據訪問控制修飾符的不同 序列化後的 屬性長度和屬性值會有所不同,所以這裡簡單提一下
public(公有)
protected(受保護)
private(私有的)
protected屬性被序列化的時候屬性值會變成%00*%00屬性名
private屬性被序列化的時候屬性值會變成%00類名%00屬性名
可能有點難理解 這裡我敲一下大家就懂了
o:3:"ctf":3:
可以看到
s:6:"*age" //*前後出現了兩個%00也就是空白符 乙個%00長度為一 所以序列化後 該屬性長度為6
s:9:"ctfflag" //ctf前後也就是類名前後出現兩個%00 所以長度為9
反序列化函式unserialize()
反序列化就是將乙個序列化的字串,還原回去
與 序列化函式類似 unserialize() 會檢查是否存在乙個 __wakeup()魔術方法
如果存在則會先呼叫__wakeup()方法在進行反序列化
可以再__wakeup()方法中對屬性進行初始化或者改變。
反序列化之前重新給flag屬性賦值
當序列化字串表示物件屬性個數的值大於真實個數的屬性時就會跳過__wakeup的執行。這個大家應該都知道很常見的姿勢了。為了直觀一點找了些考察反序列化的ctf。
首先我們本地進行序列化後得到字串
把1寫成2 達到繞過wakeup()效果 拿到flag
找到乙個 比較能總結這篇文章的題
看到良好的備份**習慣
index.php裡發現核心**
<?php
include 'class.php';
$select = $_get['select'];
$res=unserialize(@$select);
?>
讀了class.php 發現需要 username=admin 並且 password=100才可以 還有一段核心**
我們本地進行例項化 序列化
$a = new name('admin',100);
$b = serialize($a);
print_r($b);
得到序列化後的字串為
o:4:"name":2:
**中存在 __wakeup前面說過。
當序列化字串表示物件屬性個數的值大於真實個數的屬性時就會跳過__wakeup的執行。
還有因為我們要通過get方式進行提交 所以%00也必須寫在url上
最終payload為
PHP反序列化
php反序列化漏洞 一 序列化定義 序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。概念很容易理解,其實就是將資料轉化成一種可逆的資料結構,自然...
php反序列化
php序列化 將物件或變數轉換成字串。php反序列化 是將字串轉換成原來的變數。serialize serialize 函式用於序列化物件或陣列,並返回乙個字串。serialize 函式序列化物件後,可以很方便的將它傳遞給其他需要它的地方,且其型別和結構不會改變。sites array google...
PHP反序列化
類定義是以關鍵字class開頭,後跟類的名稱。類的主體是包含在一對花括號中,裡面有類的屬性與方法的定義。類屬性存在於資料段,類方法存在於 段,對於乙個類來說,類的方法不占用類的空間,佔空間的只有類的屬性。要建立乙個類的例項,必須使用new關鍵字。當建立新物件時該物件總是被賦值,除非該物件定義了建構函...