不安全的反序列化

什么是反序列化?

有些時(shí)候我們需要把應(yīng)用程序中的數(shù)據(jù)以另一種形式進(jìn)行表達(dá)搂捧,以便于將數(shù)據(jù)存儲(chǔ)起來(lái)扮宠,并在未來(lái)某個(gè)時(shí)間點(diǎn)再次使用,或者便于通過(guò)網(wǎng)絡(luò)傳輸給接收方松靡。這一過(guò)程我們把它叫做序列化简僧。典型的例子是,用戶數(shù)據(jù)被序列化后存儲(chǔ)到數(shù)據(jù)庫(kù)中雕欺,另一個(gè)例子是在Stateless架構(gòu)下岛马,用戶登陸后的身份數(shù)據(jù)被序列化存儲(chǔ)到了瀏覽器中。

反序列化和序列化是兩個(gè)正好相反的過(guò)程屠列。當(dāng)我們要再次使用這些數(shù)據(jù)的時(shí)候啦逆,應(yīng)用程序讀取序列化之后的數(shù)據(jù),并將其恢復(fù)成應(yīng)用程序中的數(shù)據(jù)笛洛。例如服務(wù)器端從Redis中讀出一個(gè)鍵值對(duì)夏志,其內(nèi)容是JSON格式的字符串,代表了某個(gè)用戶的個(gè)人資料苛让,并將其恢復(fù)成應(yīng)用程序可使用的數(shù)據(jù)沟蔑。

反序列化有什么安全問(wèn)題?

盡管反序列化最嚴(yán)重可導(dǎo)致遠(yuǎn)程代碼執(zhí)行(RCE蝌诡,Remote Code Execution)溉贿,但最常見(jiàn)的反序列化安全問(wèn)題卻是通過(guò)修改序列化之后的數(shù)據(jù)字段,從而進(jìn)行提權(quán)或越權(quán)操作浦旱。

舉例來(lái)說(shuō)宇色,服務(wù)器端為了能快速橫向擴(kuò)展而被設(shè)計(jì)成了后端無(wú)服務(wù)狀態(tài)架構(gòu),這也就意味著用戶登陸后,其身份信息(例如用戶ID宣蠕,姓名例隆,角色,登陸時(shí)間戳等)被保存到了瀏覽器cookie當(dāng)中抢蚀,在后續(xù)的請(qǐng)求里將會(huì)被自動(dòng)發(fā)往服務(wù)器镀层。


圖:用戶登陸后,服務(wù)器將用戶身份信息存儲(chǔ)在瀏覽器cookie中

存儲(chǔ)于cookie中的這份數(shù)據(jù)的格式是應(yīng)用程序自定義的皿曲,但攻擊者通過(guò)探索嘗試后發(fā)現(xiàn)唱逢,修改其中的某個(gè)字段就能將用戶從普通用戶修改為管理員。

存儲(chǔ)于cookie中的原始數(shù)據(jù):
Cookie: 3844998|AliceM|y|27|*NU*|active|null|201809

經(jīng)過(guò)修改后的數(shù)據(jù)
Cookie: 3844998|AliceM|y|27|*ADMIN*|active|null|201809

由于缺乏對(duì)數(shù)據(jù)完整性的校驗(yàn)屋休,服務(wù)器端在收到被修改過(guò)的這段數(shù)據(jù)后坞古,就把當(dāng)前用戶當(dāng)作ADMIN用戶來(lái)處理了。

這些地方有反序列化安全問(wèn)題

上面舉的例子是瀏覽器存儲(chǔ)cookie中的數(shù)據(jù)可能遭受反序列化的攻擊劫樟,但還有其他很多地方也可能發(fā)生這樣的攻擊痪枫。例如HTTP請(qǐng)求body中的表達(dá)了某個(gè)或某些數(shù)據(jù)的JSON字符串,甚至Form表單中的數(shù)據(jù)某種程度上也是數(shù)據(jù)經(jīng)過(guò)反序列化后的表達(dá)形式叠艳。

抽象來(lái)看奶陈,只要是從Application之外讀取或接收數(shù)據(jù),并將其反序列化成Application或API中的對(duì)象附较,都可能存在反序列化安全問(wèn)題吃粒。

因此,下面這些地方同樣可能存在反序列化安全隱患拒课,但很可能不常被關(guān)注到:

  • 自定義的HTTP Header
  • 存儲(chǔ)在Redis声搁、MongoDB、MySQL等數(shù)據(jù)庫(kù)里的數(shù)據(jù)捕发,可能被不懷好意的員工修改
  • 存儲(chǔ)在服務(wù)器本地,或者某個(gè)遠(yuǎn)程文件服務(wù)器里的文件很魂,可能被攻擊者替換
  • 緩存服務(wù)器中的數(shù)據(jù)可能被攻擊者污染

怎么防御反序列化攻擊扎酷?

治病需要除根,能從根本上阻止反序列化安全問(wèn)題的防御方案就是完整性校驗(yàn)遏匆,而最常見(jiàn)的例子之一就是JWT法挨。

我們知道JWT由3部分組成:Header,Payload幅聘,Verify Signature凡纳。最后的簽名部分其實(shí)就是對(duì)數(shù)據(jù)進(jìn)行完整性校驗(yàn)的關(guān)鍵部分。


圖:JWT基本結(jié)構(gòu)

服務(wù)器端在接受到JWT之后帝蒿,首先用secret對(duì)數(shù)據(jù)部分進(jìn)行哈希計(jì)算荐糜,隨后檢查計(jì)算出來(lái)的哈希值是否和請(qǐng)求中的JWT簽名部分的哈希值相同。若兩者一致則認(rèn)為數(shù)據(jù)完整性沒(méi)有被破壞,若兩者有差異則說(shuō)明數(shù)據(jù)被修改過(guò)暴氏。

如果攻擊者想要憑空偽造一個(gè)JWT延塑,或者想修改JWT中的數(shù)據(jù),但由于計(jì)算哈希值的secret只有服務(wù)器端才知道答渔,因此攻擊者無(wú)法偽造出合法的簽名字段关带,進(jìn)而這樣有問(wèn)題的JTW很容易就能被服務(wù)器端識(shí)別出來(lái)。

值得注意的是沼撕,完整性校驗(yàn)還需要把數(shù)據(jù)結(jié)構(gòu)也包含進(jìn)來(lái)宋雏,這是因?yàn)楣粽呖赡軙?huì)修改序列化后的數(shù)據(jù)的結(jié)構(gòu),而不僅僅只是數(shù)據(jù)务豺。

其他防御措施

除此之外其他有助于防御反序列化安全問(wèn)題的措施磨总,但并不能完美的做到事前預(yù)防,例如:

  • 反序列化之前冲呢,先進(jìn)行嚴(yán)格的數(shù)據(jù)類型校驗(yàn)舍败。由于校驗(yàn)規(guī)則容易被攻擊者探索出來(lái),進(jìn)而容易被繞過(guò)敬拓,因此防御不能僅依賴這一個(gè)手段邻薯,但可以作為完整性校驗(yàn)防御方案的補(bǔ)充。
  • 對(duì)反序列化過(guò)程進(jìn)行詳盡的日志記錄乘凸,用以安全審計(jì)或調(diào)查厕诡。
  • 監(jiān)控反序列化過(guò)程,在發(fā)現(xiàn)疑似反序列化攻擊時(shí)進(jìn)行警報(bào)营勤。

誤區(qū)

HTTPS自帶了完整性校驗(yàn)灵嫌,一旦有人修改或替換了請(qǐng)求內(nèi)容,就會(huì)被識(shí)別出來(lái)葛作,所以作為開(kāi)發(fā)團(tuán)隊(duì)寿羞,是不是就可以不用關(guān)心反序列化防御了?

HTTPS確實(shí)為數(shù)據(jù)傳輸提供了強(qiáng)有力的安全保護(hù)赂蠢,但它只能對(duì)傳輸中的數(shù)據(jù)進(jìn)行保護(hù)绪穆,能避免出現(xiàn)中間人攻擊(Man-In-The-Middle),然而反序列化攻擊卻往往是在數(shù)據(jù)傳輸之前進(jìn)行的虱岂,因此HTTPS并不能提供足夠的防護(hù)玖院。

這就猶如HTTPS只是一個(gè)盡心盡力的快遞公司,它能安全的把貨物從甲地運(yùn)送到乙地第岖,它可以保證遞送過(guò)程中貨物不被人調(diào)包难菌,但如果攻擊者交給快遞公司的貨物就是有問(wèn)題的刽锤,那快遞公司對(duì)此也無(wú)能為力硫眨,只要不是違禁品,它只能老老實(shí)實(shí)的把有問(wèn)題的貨物遞交給收貨方嗓奢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猎塞,隨后出現(xiàn)的幾起案子试读,更是在濱河造成了極大的恐慌,老刑警劉巖荠耽,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩骇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铝量,警方通過(guò)查閱死者的電腦和手機(jī)倘屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慢叨,“玉大人纽匙,你說(shuō)我怎么就攤上這事∨男常” “怎么了烛缔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)轩拨。 經(jīng)常有香客問(wèn)我践瓷,道長(zhǎng),這世上最難降的妖魔是什么亡蓉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任晕翠,我火速辦了婚禮,結(jié)果婚禮上砍濒,老公的妹妹穿的比我還像新娘淋肾。我一直安慰自己,他們只是感情好爸邢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布樊卓。 她就那樣靜靜地躺著,像睡著了一般杠河。 火紅的嫁衣襯著肌膚如雪简识。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天感猛,我揣著相機(jī)與錄音,去河邊找鬼奢赂。 笑死陪白,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳灶。 我是一名探鬼主播咱士,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼立由,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了序厉?” 一聲冷哼從身側(cè)響起锐膜,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弛房,沒(méi)想到半個(gè)月后道盏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡文捶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年荷逞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹排。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡种远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顽耳,到底是詐尸還是另有隱情坠敷,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布射富,位于F島的核電站膝迎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辉浦。R本人自食惡果不足惜弄抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪郊。 院中可真熱鬧掂恕,春花似錦、人聲如沸弛槐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乎串。三九已至店枣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叹誉,已是汗流浹背鸯两。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留长豁,地道東北人钧唐。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匠襟,于是被迫代替她去往敵國(guó)和親钝侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该园,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容