攻防世界-unserialize3
序列化和反序列化
序列化通俗來講就是將對象轉化為可以傳輸的字符串;
反序列化就是把那串可以傳輸的字符串再變回對象。
例子:
<?php
class chybeta{
var $test = '123';
}
$class1 = new chybeta; //這里就是創建啦一個新的對象
$class1_ser = serialize($class1); //將這個對象進行字符串封裝,就是對其進行序列化
print_r($class1_ser);
?>
來解釋一下:O:7:"chybeta":1:{s:4:"test";s:3:"123";}
這里的O呢就是object對象的意思,數字7代表着對象的函數名有7個占位,然后就是對象名了
這個數字1表示對象里有一個變量,大括號里的s代表的是string類型還有一個i是int型
再使用反序列化函數,結果print為chybeta Object([test] => 123)
原文鏈接:https://blog.csdn.net/LTtiandd/article/details/99591998
魔法函數
題目分析
訪問看到
明顯需要看出需要繞過__wakeup函數才行,?code表名使用GET方法傳參數__
code可能是XCTF類序列化再反序列化的結果
_wakeup()函數漏洞原理:當序列化字符串表示對象屬性個數的值大於真實個數的屬性時就會跳過__wakeup的執行。
所以將對象數改成1以上的值就可以,也就是XCTF后的2,表示的是類中的變量的個數。
payload: ?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
參考:(3條消息) 攻防世界-unserialize3_魔術函數,以及wakeup()函數的繞過_Kvein Fisher的博客-CSDN博客