Insecure Deserialization

不安全的反序列化問題

駭客將攻擊字串注入序列化的結構中,使得網站伺服器解析後出現非預期的結果,並執行駭客指定的行為
 

漏洞成因

由於開發認為用戶無法讀取或操弄這些較底層的數據,所以會認為反序列化是可信任的,因此沒有對輸入的內容做校檢
 

漏洞影響

不安全的反序列化影響非常嚴重,因為它可以影響後端的判斷行為 ,導致權限提升,任意文件存取,阻斷服務攻擊等漏洞, 如果在搭配其他手法甚至允許攻擊者製做更多危險漏洞 ,像是RCE遠程執行代碼
 


 

名詞解釋

● 序列化(Serialization)

將Object轉換成stream of byte的過程
將複雜的數據結構轉換為更扁平格式的過程,常見的格式有JSON、YAML或XML

ex:
以php為例,
object如下
$user->name = “carlos”; $user->isLoggedIn = false;
透過 serialize()變成stream of byte的內容類似如下
O:4:"User":2:{s:4:"name":s:6:"carlos"; s:10:"isLoggedIn":b:0;}

● 反序列化(Deserialization)

將stream of byte轉換成Object的過程

ps:
以上述stream of byte為例, 說明如下
● O:4:“User” – An object with the 4-character class name “User”
● 2 – the object has 2 attributes
● s:4:“name” – The key of the first attribute is the 4-character string “name”
● s:6:“carlos” – The value of the first attribute is the 6-character string “carlos”
● s:10:“isLoggedIn” – The key of the second attribute is the 10-character string “isLoggedIn”
● b:0 – The value of the second attribute is the boolean value false

● 反序列化問題(insecure Deserialization)

修改stream of byte導致在轉換成object後影響後端行為

ex:
假如後端的邏輯如下

if ($user->isLoggedIn === true) {
// allow access to admin interface
}

當攻擊者將stream of byte的b:0修改為b:1 ,如下
O:4:"User":2:{s:4:"name":s:6:"carlos"; s:10:"isLoggedIn":b:1;}
送到後端轉換成Object後,就會讓後端認為是以登入狀態
因為b:1 在轉換後就等於 isLoggedIn= true,
 


 

解決方法

一.在開發時杜絕問題

*不要信任用戶傳遞的序列化結果 ,在開發時就要從不相信使用者的輸入來設計整個運作流程。
*要避免對反序列化數據錯誤檢查,有些開發會在反序列化後檢查數據,但這種檢查存在根本性的缺陷,在許多情況下,這對於阻止攻擊來說為時已晚

二.透過檢測找出問題

*要查看所有傳遞到網站的所有數據,並嘗試識別任何看起來像序列化數據的內容,並測試是否有不安全的反序列化問題
 
 
 
refer
https://www.anquanke.com/post/id/224769
https://portswigger.net/web-security/deserialization/exploiting