一.根據題目猜測這道題應該和反序列化漏洞有關
1.先了解一下什么是序列化和反序列化
當在php中創建了一個對象后,可以通過 serialize() 函數把這個對象轉變成一個字符串,保存對象的值方便之后的傳遞與使用。
與 serialize() 相反的就是反序列化函數 unserialize() ,它可以將一個字符串轉變為相對應的php對象。
在序列化過程中會用到的函數:
- __construct():當對象創建(new)時會自動調用。但在 unserialize() 時是不會自動調用的。(構造函數)
- __destruct():當對象被銷毀時會自動調用。(析構函數)
- __wakeup():unserialize() 時會自動調用。
- __sleep() 在對象被序列化之前運行。
- __toString ()當一個對象被當作一個字符串使用。
從序列化到反序列化這幾個函數的執行過程是:
先調用__construct()->__sleep->__wakeup()->__toString ()->__destruct()
2.實驗步驟:
打開后通過代碼發現是創建一個類
public屬性序列化后格式為:數據類型:屬性名長度:"屬性名";數據類型:屬性值長度:"屬性值"
我們試着將其序列化:得到 O:4:"xctf":1:{s:4:"flag";s:3:"111";}
wakeup()漏洞就是與整個屬性個數值有關。
當序列化字符串表示對象屬性個數的值大於真實個數的屬性時就會跳過wakeup的執行。
我們要反序列化xctf類的同時還要繞過wakeup方法的執行否則 將會輸出bad requests
我們構造 O:4:"xctf":2:{s:4:"flag";s:3:"111";}
拿到flag。