不安全的反序列化問題
駭客將攻擊字串注入序列化的結構中,使得網站伺服器解析後出現非預期的結果,並執行駭客指定的行為
漏洞成因
由於開發認為用戶無法讀取或操弄這些較底層的數據,所以會認為反序列化是可信任的,因此沒有對輸入的內容做校檢
漏洞影響
不安全的反序列化影響非常嚴重,因為它可以影響後端的判斷行為 ,導致權限提升,任意文件存取,阻斷服務攻擊等漏洞, 如果在搭配其他手法甚至允許攻擊者製做更多危險漏洞 ,像是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