php 方面反序列化參考:https://www.cnblogs.com/20175211lyz/p/11403397.html
簡介
是什麼?
序列化是指将對象轉化為位元組流或者字元串,友善存儲或運輸。序列化後的資訊包含:對象的類型、對象屬性類型、對象屬性對應的值。而反序列化是序列化的逆操作。
不安全的反序列化是指使用者可以控制要進行反序列化的資料。注入惡意對象、觸發惡意操作。是以有時又稱對象注入(object injection)。
攻擊點在于:
- 修改反序列化對象的資料或資料類型,以更改程式邏輯。
- 如果存在魔術方法,則可以嘗試利用魔術方法中的敏感操作。
序列化使用場景
在很多應用中,需要對某些對象進行序列化,讓它們離開記憶體空間,入住實體硬碟,以便減輕記憶體壓力或便于長期儲存。
比如最常見的是Web伺服器中的Session對象,當有 10萬使用者并發通路,就有可能出現10萬個Session對象,記憶體可能吃不消,于是Web容器就會把一些seesion先序列化到硬碟中,等要用了,再把儲存在硬碟中的對象還原到記憶體中。
例子: 淘寶每年都會有定時搶購的活動,很多使用者會提前登入等待,長時間不進行操作,一緻儲存在記憶體中,而到達指定時刻,幾十萬使用者并發通路,就可能會有幾十萬個session,記憶體可能吃不消。這時就需要進行對象的活化、鈍化,讓其在閑置的時候離開記憶體,将資訊儲存至硬碟,等要用的時候,就重新加載進記憶體。
摘自網絡
如何攻擊
通常是白盒審計,因為不知道代碼細節的話,幾乎無法攻擊成功。
黑盒時如果發現對方使用某些架構,則可以嘗試對搜素這些架構已有反序列化利用鍊。工具 phpggc 、 ysoserial
白盒審計思路:
-
識别哪些可控輸入最終會被反序列化。
某些是架構的調用鍊。
-
嘗試進行利用。
讀懂程式邏輯,通過建構代碼構造惡意 反序列化資料
如果發現使用了已存在 調用鍊利用的架構、插件之類,則直接使用相應的利用工具。
防禦
在進行反序列化之前,對資料進行過濾、檢查。
不同語言特性 & 檢測 & 利用
php
serialize()、 unserialize()
調用鍊payload 工具 phpggc
反序列化特性
結合語言特性,例如 php 種 phar:// ,其讀取 phar 檔案,phar 檔案是一種打包格式,其檔案種的 metadata 區域的資料以 序列化形式存儲。當通過該協定進行讀取檔案時,這部分資料會自動執行反序列化。
php >= 7.2 反序列化的時候對通路類别不敏感,但如果不指定全部的屬性,就會出錯。
不同屬性的類變量序列化後資料的格式不同。
-
public變量
直接變量名反序列化出來
- protected變量
可以用\x00 + * + \x00 + 變量名
來代替S:5:"\00*\00op"
s:5:"?*?op"
- private變量
\x00 + 類名 + \x00 + 變量名
魔術方法
php 官方手冊 - 魔術方法
魔術方法(magic method )是 php 類中一組特殊的方法,在特定情況下會被隐性調用。
跟序列化相關:
__sleep __serialize #在序列化之前調用
__wakeup __unserialize #在反序列化之前調用
# 當同時定義 __sleep __serialize 時,後者将生效, __wakeup 與 __unserialize 也一樣
在反序列化漏洞挖掘中常見的可能用到的魔術方法:
__destruct # 當反序列化建立的對象被銷毀,則調用這個方法。
__toString # 當對象被當作字元串時,會被調用
__invoke # 當對象被當作函數時,會被調用
__call # 當調用對象中不可通路的函數時,會被調用
__set # 給不可通路屬性指派時, 會被調用。
__get # 讀不可通路屬性的值時, 會被調用。
__isset # 對不可通路屬性調用 isset() 或 empty() 時,會被調用。
__unset # 對不可通路屬性調用 unset() 時,會被調用。
漏洞
CVE-2016-7124 (php < 5.6.25 | < 7.0.10)可以繞過 反序列化過程中 __wakeup() 方法的執行。
其它
burp 的被動審計功能會自動标記出http 請求資料中的序列化資料,但如果資料被多重編碼,則失效
暫未研究的
等到後面碰到了再研究,感興趣請查閱 https://book.hacktricks.xyz/pentesting-web/deserialization
java
https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet
java 序列化的資料通常是以特殊的頭部作為起始,HEX aced ,Base64 rO0
python
https://zhuanlan.zhihu.com/p/89132768
ruby
nodejs
jms
.net
https://github.com/pwntester/ysoserial.net