跳過_wakeup()魔法函數
__wakeup(): 將在序列化之后立即被調用
漏洞原理: 當反序列化字符串中,表示屬性個數的值大於其真實值,則跳過__wakeup()執行
對於該題,先可以看到類xctf中有flag變量,並調用了__wakeup(),則考慮實例化xctf類並將其變量序列化。並猜測意圖為將序列化結果輸入在?code=后進行GET請求。
進行序列化操作
1 <?php 2 class xctf{ 3 public $flag = '111'; 4 pubilc function __wakeup(){ 5 exit('bad requests'); 6 } 7 } 8
9 $a = new xctf(); 10 echo(serialize($a)); 11 ?>
// 序列化輸出結果為:
// O:4:"xctf":1:{s:4:"flag";s:3:"111";}
xctf為類名,4為字符數,1為序列化字符串中變量個數
正常結果輸入時,會執行__wakeup(),從而輸出'bad requests',並退出腳本,因此利用漏洞繞過__wakeup()
將序列化字符串中代表變量個數的數字改為大於其真實值的數字,並進行GET請求,得到結果。