iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 11
1

A8 - Insecure Deserialization 不安全的反序列化漏洞

再進入這主題之前,讓我先來談談,究竟何謂是「序列化」與「反序列化」。

序列化 VS 反序列化

這裡 Wiki 告訴了我們:

https://ithelp.ithome.com.tw/upload/images/20190924/20115060yiancO4SjF.png

恩!不意外!字很多 /images/emoticon/emoticon20.gif

這裡簡單說說

https://ithelp.ithome.com.tw/upload/images/20190927/20115060blg1OEgSyO.png

圖片來源:騰訊雲

序列化是將物件狀態轉換為可保存可傳輸格式的形式。而反序列化則是序列化的相反,它可以將資料流轉換成物件。將這兩種處理序搭配使用,使資料容易被用於儲存和傳輸。

  • 二進位序列化可以保留型別的精確度,這在對應用程式進行不同叫用時保留物件的狀態很有用。例如,藉由將物件序列化至剪貼簿,不同應用程式就可共用它。遠端處理會使用序列化來將物件以「傳值」(By Value) 方式從一電腦或應用程式定義域傳遞至另一電腦或應用程式定義域。

  • XML 序列化僅會序列化公用屬性和欄位,而不保留型別精確度。當您要提供或取用資料,而不限制使用該資料的應用程式時,這很有用。因為 XML 是開放式標準,所以在網路上共用資料時,這是一個頗具吸引力的選擇。

說明

不安全的反序列化漏洞主要是鎖定 Java、PHP 或 Node.js 等常見的平臺。它容易導致以下攻擊發生:

  • 遠端程式碼執行(RCE)
  • 重播攻擊(Relay Attacks)
  • 注入攻擊( Injection Attacks)
  • 特權升級攻擊(Privilege Escalation Attacks)

這裡舉個 RCE 的例子:

反序列化漏洞利用 Java 反射機制的副作用,在物件 return 之前就將所有動作執行完畢,導致反序列化在解開 byteStream 時並且跳出在跳出 Error 之前,就將 Payload 全數執行完畢。導致攻擊者只要掌握後端程式中有何種函式庫,將函式庫中各種函式做組合,跨函式庫呼叫函式組合成 Gadget Chain,最終執行Runtime.getRuntime().exec()以執行任意惡意代碼。

簡單來說就是一個使用者將 110V 的電器插入 220V 的插座中,雖然是一樣的插座孔,不過使用者並不知道插座的伏特數是多少,直到插座與電器通電、電器燒壞後才發現伏特數不合拍。同樣的,反序列化也是在含有遠端代碼執行的 byteStream 進入系統,在 Payload 執行後才發現,這 byteStream 格式是有問題的。

防護建議

針對任何序列化的物件落實完整性的檢查。如:數位簽章,防止惡意物件的建立或資料被篡改。


上一篇
『 Day 10 』Web Security - A7 . Cross-Site Scripting (XSS) - 下篇
下一篇
『 Day 12』Web Security - A9 . 使用已有漏洞的元件
系列文
到處挖坑,現在該來還(填)願(坑)ㄌ !!!30

尚未有邦友留言

立即登入留言