天天看點

4.9 Deserialization

php 方面反序列化參考:https://www.cnblogs.com/20175211lyz/p/11403397.html

簡介

是什麼?

序列化是指将對象轉化為位元組流或者字元串,友善存儲或運輸。序列化後的資訊包含:對象的類型、對象屬性類型、對象屬性對應的值。而反序列化是序列化的逆操作。

不安全的反序列化是指使用者可以控制要進行反序列化的資料。注入惡意對象、觸發惡意操作。是以有時又稱對象注入(object injection)。

攻擊點在于:

  1. 修改反序列化對象的資料或資料類型,以更改程式邏輯。
  2. 如果存在魔術方法,則可以嘗試利用魔術方法中的敏感操作。

序列化使用場景

在很多應用中,需要對某些對象進行序列化,讓它們離開記憶體空間,入住實體硬碟,以便減輕記憶體壓力或便于長期儲存。

比如最常見的是Web伺服器中的Session對象,當有 10萬使用者并發通路,就有可能出現10萬個Session對象,記憶體可能吃不消,于是Web容器就會把一些seesion先序列化到硬碟中,等要用了,再把儲存在硬碟中的對象還原到記憶體中。

例子: 淘寶每年都會有定時搶購的活動,很多使用者會提前登入等待,長時間不進行操作,一緻儲存在記憶體中,而到達指定時刻,幾十萬使用者并發通路,就可能會有幾十萬個session,記憶體可能吃不消。這時就需要進行對象的活化、鈍化,讓其在閑置的時候離開記憶體,将資訊儲存至硬碟,等要用的時候,就重新加載進記憶體。

摘自網絡
如何攻擊

通常是白盒審計,因為不知道代碼細節的話,幾乎無法攻擊成功。

黑盒時如果發現對方使用某些架構,則可以嘗試對搜素這些架構已有反序列化利用鍊。工具 phpggc 、 ysoserial

白盒審計思路:

  1. 識别哪些可控輸入最終會被反序列化。

    某些是架構的調用鍊。

  2. 嘗試進行利用。

    讀懂程式邏輯,通過建構代碼構造惡意 反序列化資料

    如果發現使用了已存在 調用鍊利用的架構、插件之類,則直接使用相應的利用工具。

防禦

在進行反序列化之前,對資料進行過濾、檢查。

不同語言特性 & 檢測 & 利用

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