5.17反序列化

路Sang發表於2024-06-01

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

發現思路:登入回顯資料包時,資料為序列化結果資料,而檢視使用者資訊時,將序列化資料輸出回顯了正常資料,構成了序列化和反序列化(關鍵);

相關文章