水平權(quán)限漏洞的修復(fù)方案

水平權(quán)限漏洞一般出現(xiàn)在一個(gè)用戶對(duì)象關(guān)聯(lián)多個(gè)其他對(duì)象(訂單、地址等)、并且要實(shí)現(xiàn)對(duì)關(guān)聯(lián)對(duì)象的CRUD的時(shí)候悯仙。開發(fā)容易習(xí)慣性的在生成CRUD表單(或AJAX請(qǐng)求)的時(shí)候根據(jù)認(rèn)證過的用戶身份來找出其有權(quán)限的被操作對(duì)象id,提供入口,然后讓用戶提交請(qǐng)求嗽仪,并根據(jù)這個(gè)id來操作相關(guān)對(duì)象。在處理CRUD請(qǐng)求時(shí)柒莉,往往默認(rèn)只有有權(quán)限的用戶才能得到入口钦幔,進(jìn)而才能操作相關(guān)對(duì)象,因此就不再校驗(yàn)權(quán)限了常柄±鹎猓可悲劇的是大多數(shù)對(duì)象的ID都被設(shè)置為自增整型,所以攻擊者只要對(duì)相關(guān)id加1西潘、減1卷玉、直至遍歷,就可以操作其他用戶所關(guān)聯(lián)的對(duì)象了喷市。

水平權(quán)限漏洞的原理看似簡(jiǎn)單相种,但他和開發(fā)的思維、編碼習(xí)慣剛好相反品姓,因此會(huì)經(jīng)常冒出來寝并。尤其是WAP和AJAX接口,開發(fā)者往往不把這些接口當(dāng)作HTTP請(qǐng)求看腹备,增加了很多其實(shí)不存在的有利于安全假設(shè)條件衬潦,從而導(dǎo)致更加忽視對(duì)權(quán)限的鑒別。

因?yàn)檫@類關(guān)聯(lián)對(duì)象的操作都和業(yè)務(wù)相關(guān)植酥,且接口獨(dú)立镀岛,所以很難實(shí)現(xiàn)通用的預(yù)防或解決方案,這也是這類漏洞讓人頭疼的原因之一友驮。今天在修復(fù)一個(gè)水平權(quán)限漏洞時(shí)漂羊,給開發(fā)同學(xué)介紹了下水平權(quán)限漏洞的修復(fù)方案,而開發(fā)同學(xué)又提出了一個(gè)我之前沒想過的方法卸留,因此決定一起整理出來走越。

漏洞示例
getAddress.do?addressId=12345
攻擊者修改addressId即可得到他人的address信息。

修復(fù)方案0:

先看一個(gè)有問題的方案:將addressid改成一個(gè)具有一定長度的隨機(jī)字符串耻瑟,如5d41402abc4b2a76b9719d911017c592旨指,認(rèn)為只有有權(quán)限的人才能得到這個(gè)入口赏酥,而且不能通過加1、減1的方式預(yù)測(cè)別人的入口淤毛,因此不再做進(jìn)一步的權(quán)限檢查(很多初級(jí)的招聘頁面都是以這種方式來管理簡(jiǎn)歷的)今缚。這個(gè)方案看上去沒有問題,可是和國內(nèi)的環(huán)境結(jié)合起來就會(huì)悲劇——至少我遇到過的低淡,搜狗瀏覽器會(huì)把用戶發(fā)送的請(qǐng)求上傳到服務(wù)器上姓言,作為其搜索引擎爬蟲的爬取源,這樣爬蟲就會(huì)通告查詢操作得到相關(guān)的對(duì)象信息蔗蹋,并展示在搜索引擎上何荚,如果對(duì)象信息包含敏感內(nèi)容,則產(chǎn)生隱私泄露的安全事件猪杭。

修復(fù)方案1:

這個(gè)是最直接有效的修復(fù)方案:在web層的邏輯中做鑒權(quán)餐塘,檢查提交CRUD請(qǐng)求的操作者(通過session信息得到)與目標(biāo)對(duì)象的權(quán)限所有者(查數(shù)據(jù)庫)是否一致,如果不一致則阻斷皂吮。這個(gè)方案實(shí)現(xiàn)成本低戒傻、能確保漏洞的修復(fù)質(zhì)量,缺點(diǎn)是增加了一次查庫操作蜂筹。我之前一直用這種方案來對(duì)已發(fā)生的水平權(quán)限漏洞做緊急修復(fù)需纳。

修復(fù)方案2:

我認(rèn)為最正規(guī)的方案:把權(quán)限的控制轉(zhuǎn)移到數(shù)據(jù)接口層中,避免出現(xiàn)select/update/delete ... where addressID=#addressID#的SQL語句艺挪,使用selectt/update/delete... where addressID=#addressID# and ownerId=#userId#來代替不翩,要求web層在調(diào)用數(shù)據(jù)接口層的接口時(shí)額外提供userid,而這個(gè)userid在web層看來只能通過seesion來取到麻裳。這樣在面對(duì)水平權(quán)限攻擊時(shí)口蝠,web層的開發(fā)者不用額外花精力去注意鑒權(quán)的事情,也不需要增加一個(gè)SQL來專門判斷權(quán)限——如果權(quán)限不對(duì)的話津坑,那個(gè)and條件就滿足不了妙蔗,SQL自然就找不到相關(guān)對(duì)象去操作。而且這個(gè)方案對(duì)于一個(gè)接口多個(gè)地方使用的情況也比較有利国瓮,不需要每個(gè)地方都鑒權(quán)了灭必。但這個(gè)方案的缺陷在于實(shí)現(xiàn)起來要改動(dòng)底層的設(shè)計(jì),所以不適合作為修復(fù)方案乃摹,更適合作為統(tǒng)一的控制方案在最開始設(shè)計(jì)時(shí)就注意這方面的問題。

修復(fù)方案3:

今天開發(fā)同學(xué)提到一種我之前沒想到過的方式跟衅,實(shí)際上是對(duì)方案1的修改:在生成表單時(shí)孵睬,增加一個(gè)token參數(shù),而token=md5(addressId+sessionId+key)伶跷;在處理請(qǐng)求時(shí)掰读,用addressId秘狞、sessionId和key來驗(yàn)證token。這樣的方案實(shí)現(xiàn)起來很簡(jiǎn)單蹈集,又不增加額外的SQL查詢開銷烁试,看起來比方案1更好÷K粒可我之前沒有想到過這種方案减响,乍一看又是把鑒權(quán)和操作這一串同步的操作異步化了(實(shí)際上是在生成表單的時(shí)候鑒權(quán)并生成token,然后在操作時(shí)只驗(yàn)證token而不鑒權(quán))郭怪,所以一時(shí)還拿不準(zhǔn)這樣會(huì)不會(huì)有啥問題~不過我是想了半天也找不到漏洞哈~

修復(fù)方案4:

把這種屬主支示、權(quán)限、對(duì)象鄙才、操作的場(chǎng)景抽象成一個(gè)統(tǒng)一的框架颂鸿,在框架內(nèi)一個(gè)地方實(shí)現(xiàn)權(quán)限的管理和檢查。當(dāng)然這個(gè)說起來有點(diǎn)扯淡了攒庵,在產(chǎn)品設(shè)計(jì)階段是不是有人愿意花大成本來設(shè)計(jì)相關(guān)框架呢嘴纺?如果最開始沒有框架,那么什么時(shí)候愿意花更大的成本去遷移呢浓冒?我想最終還是會(huì)按方案1栽渴、2、3來吧裆蒸。

另外的方法:

  • 1熔萧、可對(duì)ID加密
  • 2、使用GUID
  • 3僚祷、每一個(gè)信息增加一個(gè)發(fā)布人的字段佛致,修改的人必須與發(fā)布的人為同一個(gè)人才可以訪問
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辙谜,隨后出現(xiàn)的幾起案子俺榆,更是在濱河造成了極大的恐慌,老刑警劉巖装哆,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐脊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜕琴,警方通過查閱死者的電腦和手機(jī)萍桌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌简,“玉大人上炎,你說我怎么就攤上這事〕В” “怎么了藕施?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵寇损,是天一觀的道長。 經(jīng)常有香客問我裳食,道長矛市,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任诲祸,我火速辦了婚禮浊吏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烦绳。我一直安慰自己卿捎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布径密。 她就那樣靜靜地躺著午阵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪享扔。 梳的紋絲不亂的頭發(fā)上底桂,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音惧眠,去河邊找鬼籽懦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氛魁,可吹牛的內(nèi)容都是我干的暮顺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼秀存,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捶码!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起或链,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤惫恼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后澳盐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祈纯,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年叼耙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕窥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筛婉,死狀恐怖油昂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倾贰,我是刑警寧澤冕碟,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站匆浙,受9級(jí)特大地震影響安寺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜首尼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一挑庶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧软能,春花似錦迎捺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跋核,卻和暖如春岖瑰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂代。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工蹋订, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刻伊。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓露戒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捶箱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子智什,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,730評(píng)論 25 707
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,911評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)讼呢,斷路器撩鹿,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 【日更096】 “身為父母,要不要給孩子一鍵定制‘完美人生’”悦屏? 本周《奇葩說》辯題节沦。 題目乍聽起來“腦洞大開”,...
    唐斬2086閱讀 1,634評(píng)論 0 2
  • 宿舍有一個(gè)舍友特別愛賴床础爬。 “八點(diǎn)了甫贯,還不起來,第一節(jié)有課看蚜〗懈椋” “不去了,不去了,昨天兩點(diǎn)才睡渴逻,困死了疾党。你幫我點(diǎn)到...
    慵懶小獸閱讀 179評(píng)論 0 0