1、原理
序列化:物件狀態-可儲存或傳輸形式的過程,將狀態資訊儲存為字串;
反序列化:序列化的字串-物件;
惡意程式碼注入到應用程式中,程式從不安全來源反序列化資料時,資料從一種格式(json、xml)轉化為(物件或列表),如果不檢查安全性,則攻擊者構造惡意程式碼在資料,程式反序列化時,惡意程式碼執行(RCE遠端程式碼執行);
2、魔法函式
魔法函式 | 呼叫的時機 |
---|---|
__construct() | 初始化類的時候,一般對於變數進行賦值 |
__destruct() | 和建構函式相反,在物件不再被使用時(將所有該物件的引用設為null)或者程式退出時自動呼叫 |
__toString() | 當一個物件被當作一個字串被呼叫,把類當作字串使用時觸發,返回值需要為字串 |
__wakeup() | 使用unserialize時觸發,反序列化恢復物件之前呼叫該方法 |
__sleep() | 使用serialize時觸發.該函式需要返回以類成員變數名作為元素的陣列(該陣列裡的元素會影響類成員變數是否被序列化。只有出現在該陣列元素裡的類成員變數才會被序列化 |
__destruct() | 物件被銷燬時觸發 |
__invoke() | 當指令碼嘗試將物件呼叫為函式時觸發 |
3、防禦
- 避免使用不知源外部資料序列化
- 輸入序列化字串驗證
- 白名單
4、php反序列化
serialize() 物件轉化字串
unserialize() 字串轉化物件
思路:字串轉物件,複製物件中的資料,在編譯;
5、JAVA反序列化
xiaodi-->txt亂碼 序列化 wirteobject
txt亂碼資料-->xiaodi 反序列化 readobject
序列化標誌參考:資料以rO0AB開頭,基本為java序列化之後base64編碼後資料;aced開頭,即為java序列化16進位制資料;
6、payload
反彈shell解決無回顯問題;
ipconfig= >序列化->base64=rO0AB格式字串 最終payload
ysoserial工具生成payload;
登入使用者返回資料包:"data":"rO0ABddsadahudqwhoodwhwdnssabndabnbnsabmdnakjqowhoi"
,解密先用base64解碼之後用SerializationDumper解析資料
檢視當前使用者資訊:
請求資料包:rO0ABddsadahudqwhoodwhwdnssabndabnbnsabmdnakjqowhoi
返回是ctfhub
發現思路:登入回顯資料包時,資料為序列化結果資料,而檢視使用者資訊時,將序列化資料輸出回顯了正常資料,構成了序列化和反序列化(關鍵);