題目
hmm....代碼硬傷暴擊..>_<..,趕緊去補了一下php的序列化知識。。。
解題過程
題目已經說明了這題是php的反序列化。代碼里面是一個類,類名xctf,類里面就一個string型變量,值為"111"。那么這題就是php的類的序列化。
__wakeup方法是php的魔術方法,當調用反序列化函數unserialize()時,會默認檢查類中是否存在__wakeup方法,如果存在,會先調用。這個方法的作用一般是用來在反序列化時做一些初始化操作。舉個栗子:假設咱們要反序列化一個DB類,里面存儲了DB的相關信息,咱們反序列化之后只是把這個類拿過來了,但數據庫連接這個操作還是要自己來做,這時就可以把數據庫連接的代碼寫到__wakeup方法里面。
?code= 應該是提示我們用code來傳參數,嘗試一下隨便寫一個:http://111.198.29.45:55539/?code=111,返回:
再試:http://111.198.29.45:55539/?code="111",返回
這里應該要傳入的是xctf類的序列化后的字符串:http://111.198.29.45:55539/?code=O:4:%22xctf%22:2:{s:4:%22flag%22;s:3:%22111%22;},拿到flag:
知識點總結
1. 魔術方法:PHP 將所有以 __(兩個下划線)開頭的類方法保留為魔術方法。個人理解就是php提供一些語言自帶的方法。
2.序列化結果解析: