目錄
一、PHP反序列化
二、JAVA反序列化
三、Shiro反序列化
Shiro-550 反序列化漏洞原理
Shiro-721 反序列化漏洞原理
Padding Oracle 漏洞補充:
防御措施:
一、PHP反序列化
主要是分為有類和無類:
1、有類:就有相關的魔術方法
2、無類:就只是序列化和反序列化
#PHP 反序列化
原理:未對用戶輸入的序列化字符串進行檢測,導致攻擊者可以控制反序列化過程,從而導致代碼
執行,SQL 注入,目錄遍歷等不可控后果。在反序列化的過程中自動觸發了某些魔術方法。當進行
反序列化的時候就有可能會觸發對象中的一些魔術方法。serialize() //將一個對象轉換成一個字符串
unserialize() //將字符串還原成一個對象觸發:unserialize 函數的變量可控,文件中存在可利用的類,類中有魔術方法:參考:https://www.cnblogs.com/20175211lyz/p/11403397.html__construct() //創建對象時觸發
__destruct() //對象被銷毀時觸發
__call() //在對象上下文中調用不可訪問的方法時觸發
__callStatic() //在靜態上下文中調用不可訪問的方法時觸發
__get() //用于從不可訪問的屬性讀取數據
__set() //用于將數據寫入不可訪問的屬性
__isset() //在不可訪問的屬性上調用 isset()或 empty()觸發
__unset() //在不可訪問的屬性上使用 unset()時觸發
__invoke() //當腳本嘗試將對象調用為函數時觸發
二、JAVA反序列化
Java中的ObjectOutputStream類的writeObject()方法可以實現序列化,其作用把對象轉換成字節流,便于保存或者傳輸,而ObjectInputStream類的readObject()方法用于反序列化,作用就是把字節流還原成對象。
三、Shiro反序列化
Shiro反序列化主要是Apache Shiro提供了一個remember 的功能,用戶登錄成功后會生成經過加密并編碼的cookie,保存在瀏覽器中方便用戶的日常使用。
而服務器對cookie的處理流程就是先獲取瀏覽器上保存的cookie,然后將其base64解碼,再進行AES解密,再將其反序列化進行校驗。
而漏洞就是出現在這里,我們都知道AES它是一個硬編碼,他是有默認密鑰的,如果程序員沒有去修改或者過于簡單,那我們就可以進行cookie重構,先構造我們的惡意代碼,然后將惡意代碼進行序列化,然后AES加密(密鑰我們已經爆破出來了)再進行base64編碼,形成我們新的cookie,而服務器在處理時就會按照剛才的處理流程,就會在服務端觸發我們構造的惡意代碼。
過程:
- 加密過程:用戶在登錄時勾選 "Remember Me" 功能,Shiro 會將用戶身份信息序列化后進行 AES 加密和 Base64 編碼,然后存儲在 cookie 的 RememberMe 字段中。
- 解密過程:當用戶再次訪問服務器時,服務器會從 cookie 中提取 RememberMe 字段,進行 Base64 解碼和 AES 解密,最后反序列化以獲取用戶身份信息。
- 攻擊者利用:攻擊者可以利用已知的或通過爆破得到的 AES 密鑰,構造惡意的序列化對象,并按照 Shiro 的加密解密流程進行處理,生成惡意的 RememberMe cookie。當服務器處理這個惡意 cookie 時,就會觸發反序列化漏洞,執行攻擊者的代碼。
?
Shiro-550 反序列化漏洞原理
Shiro-550 漏洞的根本原因在于 Shiro 使用了一個硬編碼的 AES 加密密鑰,這個密鑰在 Shiro 的源碼中是默認的,因此任何人都可以使用這個密鑰來構造 RememberMe 的值,進而讓服務器執行反序列化操作。攻擊者可以創建一個惡意對象,對其進行序列化、AES 加密和 Base64 編碼,然后將其作為 RememberMe cookie 發送給服務器。服務器在解碼和反序列化這個 cookie 時,會執行其中的惡意代碼。
Shiro-721 反序列化漏洞原理
與 Shiro-550 類似,Shiro-721 漏洞也涉及到 RememberMe 功能,但它的 AES 加密密鑰通常是隨機生成的,不容易被猜測。攻擊者需要使用有效的用戶信息和 RememberMe cookie 來執行 Padding Oracle 攻擊,構造惡意的 RememberMe 字段進行反序列化攻擊。這種攻擊利用了 AES-128-CBC 模式中的 Padding Oracle 漏洞,允許攻擊者在不知道加密密鑰的情況下,通過填充錯誤的響應時間來推斷出加密過程中的秘密信息。
Padding Oracle 漏洞補充:
Padding Orace 四攻擊指應用在解密客戶端只提交的加密數據時,泄露了解密數據的分段填充是否合法的信息。攻擊者利用PaddingOrace可以在不知道加密程序所使用的密鉬的情況下,解密數據或者加密任意數據。即使應用程序確認加密數據的完整性,仍會導致該程序仍有敏感數據泄露和越權漏洞的風,險。
密文在被解密時,會被分成若干個數據塊,每個數據塊有固定的長度,常見的加密算法只大多為8字節或16字節。當數據不滿足指定長度時,程序會通過指定的方式進行填充,以方便在解密時能剝除這些這些填充數據。常見的填充標準有PKCS#7。當填充內容與標準要求的語法不一致時,會生成一個錯誤。如果應用在解析客戶端提交的加密信息時泄露了這個填充出錯的狀態信息,就形成了Padding Oracle。
550和721區別:
550是固定密鑰,721是隨機密鑰
防御措施:
- 升級 Shiro 版本:更新到 1.2.4 以上的版本,不使用默認的加密密鑰,而是隨機生成密鑰。
- 安全配置:不要使用公開的密鑰,避免將密鑰硬編碼在代碼中,確保密鑰的安全性。
- WAF 防護:通過 Web 應用防火墻攔截異常的 RememberMe cookie 值,防止惡意利用。