官术网_书友最值得收藏!

6.4 對(duì)會(huì)話管理進(jìn)行安全防范

在一般情況下,Web開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中是會(huì)留意常規(guī)的Web安全漏洞的,但也有一些鮮為人知的漏洞廣泛存在于Web應(yīng)用程序中。大多數(shù)開(kāi)發(fā)人員針對(duì)這些漏洞不做任何考慮,使得Web應(yīng)用程序仍然處于危險(xiǎn)中。鑒于會(huì)話管理機(jī)制主要受兩類漏洞的影響,Web應(yīng)用程序必須采取相應(yīng)的防御措施,防止這些機(jī)制受到攻擊。為執(zhí)行安全的會(huì)話管理,應(yīng)用程序必須以可靠的方式生成令牌,并且必須在令牌生成到廢止的整個(gè)生命周期中確保它們的安全。

6.4.1 設(shè)置最有效的令牌生成機(jī)制

從理論上講,只要擁有足夠的時(shí)間和資源,任何數(shù)據(jù),無(wú)論其長(zhǎng)度和復(fù)雜程度如何,都可以使用蠻力猜測(cè)出來(lái)。設(shè)計(jì)強(qiáng)大的令牌生成機(jī)制的目的:在連續(xù)請(qǐng)求中重新標(biāo)識(shí)用戶身份的令牌,在其生成過(guò)程中,不應(yīng)給攻擊者提供任何機(jī)會(huì),使其能夠以常規(guī)方式預(yù)測(cè)或推斷發(fā)布給其他用戶的令牌,從而從應(yīng)用程序中獲得大量的令牌樣本。即使攻擊者擁有大量帶寬和處理資源,他也絕無(wú)可能在令牌的有效期限內(nèi)成功猜測(cè)出任何一個(gè)有效的令牌。

最有效的令牌生成機(jī)制應(yīng)當(dāng)使用數(shù)量極其龐大的一組可能值,并且包含強(qiáng)大的偽隨機(jī)源,確保令牌以無(wú)法預(yù)測(cè)的方式平均分布在可能值范圍內(nèi)。

令牌中不應(yīng)包含其他任何內(nèi)容(除服務(wù)器用來(lái)定位處理用戶請(qǐng)求的相關(guān)會(huì)話對(duì)象的一個(gè)標(biāo)識(shí)符)。無(wú)論是公開(kāi)顯示還是隱藏在幾層編碼或模糊處理中,令牌都不應(yīng)含有意義或采用結(jié)構(gòu)。所有關(guān)于會(huì)話所有者與狀態(tài)的數(shù)據(jù)都應(yīng)保存在與會(huì)話令牌對(duì)應(yīng)的服務(wù)器會(huì)話對(duì)象中。

選擇最為穩(wěn)定可靠的隨機(jī)源。開(kāi)發(fā)者應(yīng)當(dāng)認(rèn)識(shí)到,各種可用的隨機(jī)源在強(qiáng)度上可能存在巨大的差異。和java.util.Random一樣,一些隨機(jī)源非常適用于各種需要不斷變化的輸入源的情況,但只需根據(jù)唯一一個(gè)輸出項(xiàng)就可以準(zhǔn)確地推斷出它的前后隨機(jī)數(shù)。開(kāi)發(fā)者應(yīng)研究不同的可用隨機(jī)源實(shí)際使用算法的數(shù)學(xué)特性,并閱讀相關(guān)文檔資料,了解API的推薦用法。一般來(lái)說(shuō),如果某種算法沒(méi)有明確說(shuō)明它具有加密安全性,那么應(yīng)認(rèn)為它可被預(yù)測(cè)。

除選擇最為穩(wěn)定可靠的隨機(jī)源外,以與其生成令牌請(qǐng)求有關(guān)的一些信息作為熵源,也是一種良好的做法。這些信息可能并不是那個(gè)請(qǐng)求獨(dú)有的,但能夠非常有效地消除所使用的核心偽隨機(jī)數(shù)發(fā)生器存在的任何缺陷。可被合并的信息包括請(qǐng)求時(shí)間(毫秒)、請(qǐng)求中的User-Agent消息頭、來(lái)源IP地址(source IP address)及接收請(qǐng)求的端口號(hào)等元素。

合并這個(gè)熵的最有效公式是建立一個(gè)特殊的字符串,連接一個(gè)偽隨機(jī)數(shù)、一串上面列出的與請(qǐng)求有關(guān)的數(shù)據(jù)以及一個(gè)僅服務(wù)器知道并在每次重啟時(shí)重新生成的機(jī)密字符串。然后,使用適當(dāng)?shù)纳⒘兴惴▽?duì)這個(gè)字符串進(jìn)行處理,生成一個(gè)固定長(zhǎng)度、便于管理的字符串,并以它作為令牌。

決定生成會(huì)話令牌的算法后,一個(gè)有用的“思想試驗(yàn)”是想象偽隨機(jī)源被完全攻破,并總是返回相同的隨機(jī)數(shù)。如果出現(xiàn)這種情況,那么從應(yīng)用程序中獲得大量令牌樣本的攻擊者能夠截獲發(fā)布給其他用戶的令牌嗎?使用上面描述的公式,即使攻擊者完全了解生成令牌所使用的算法,一般也絕無(wú)這種可能。來(lái)源IP、端口號(hào)、User-Agent消息頭和請(qǐng)求時(shí)間共同生成一個(gè)數(shù)目龐大的熵。即使掌握所有這些信息,如果不知道服務(wù)器使用的機(jī)密字符串,攻擊者仍然無(wú)法生成對(duì)應(yīng)的令牌。

6.4.2 保障令牌使用過(guò)程中的安全

在令牌生成到廢止的整個(gè)生命周期中保障它的安全,達(dá)到不會(huì)將其泄露給除令牌用戶以外的其他任何人的目標(biāo)要做到以下幾方面。

(1)令牌只能通過(guò)HTTPS傳送。

任何以明文形式傳送的令牌都應(yīng)視為被“污染”,也就是說(shuō),不能確保用戶身份不被泄露。如果使用HTTP Cookies傳送令牌,應(yīng)將這些Cookies標(biāo)記為安全,以防止用戶瀏覽器通過(guò)HTTP傳送它們。如果可能,應(yīng)對(duì)每個(gè)應(yīng)用程序頁(yè)面使用HTTPS,包括靜態(tài)內(nèi)容(如幫助頁(yè)面、圖像等)。如果沒(méi)有可能,并且仍然采用HTTP服務(wù),那么應(yīng)用程序應(yīng)將任何訪問(wèn)敏感內(nèi)容(包括登錄頁(yè)面)的請(qǐng)求重定向到HTTPS服務(wù)。幫助頁(yè)面之類的靜態(tài)資源一般不屬于敏感內(nèi)容,不需要使用通過(guò)驗(yàn)證的會(huì)話即可訪問(wèn)。因此,可以通過(guò)使用Cookies范圍指令強(qiáng)化Cookies的使用安全,防止在訪問(wèn)這些資源的請(qǐng)求中提交令牌。

(2)絕不能在URL中傳送會(huì)話令牌。

因?yàn)檫@樣做易于受到會(huì)話固定攻擊,并可能使令牌出現(xiàn)在各種日志機(jī)制中。有時(shí)候,開(kāi)發(fā)者在禁用Cookies的瀏覽器中使用這種技巧執(zhí)行會(huì)話。然而,最好是對(duì)所有導(dǎo)航使用POST請(qǐng)求實(shí)現(xiàn)這一目的,并將令牌保存在HTML表單隱藏字段中。

(3)應(yīng)總是執(zhí)行退出功能。

通過(guò)它刪除服務(wù)器上的所有會(huì)話資源并終止會(huì)話令牌。

(4)處于非活動(dòng)狀態(tài)一段時(shí)間執(zhí)行會(huì)話終止。

會(huì)話終止的效果應(yīng)和用戶完全退出的作用完全相同。

(5)防止并行登錄。

每次一名用戶登錄,都應(yīng)發(fā)布一個(gè)新會(huì)話令牌,同時(shí)廢止任何屬于該用戶的現(xiàn)有會(huì)話,就好像他已經(jīng)退出應(yīng)用程序一樣。如果舊令牌被保存一段時(shí)間,那么隨后收到任何使用該令牌提出的請(qǐng)求,都應(yīng)向用戶發(fā)出安全警報(bào),告訴他會(huì)話已被終止,因?yàn)樗呀?jīng)從其他位置登錄。

(6)嚴(yán)密保護(hù)會(huì)話令牌的管理或診斷功能。

嚴(yán)密保護(hù)會(huì)話令牌的管理或診斷功能,以防止未授權(quán)的訪問(wèn)。許多時(shí)候,這種功能根本沒(méi)有必要顯示會(huì)話令牌,相反,它應(yīng)提供足夠的與會(huì)話所有者有關(guān)的信息,以便執(zhí)行任何支持和診斷任務(wù)。這樣做就不會(huì)泄露該用戶提交的會(huì)話令牌,使攻擊者劫持他的會(huì)話。

(7)盡可能限定應(yīng)用程序會(huì)話Cookies的域和路徑范圍。

范圍過(guò)于寬泛的Cookies通常是由配置不佳的Web應(yīng)用程序平臺(tái)或Web服務(wù)器生成的,而不是由應(yīng)用程序開(kāi)發(fā)者本人生成的。通過(guò)應(yīng)用程序Cookies范圍中的域名或URL路徑,應(yīng)無(wú)法訪問(wèn)其他Web應(yīng)用程序或不可信的功能。應(yīng)特別注意用于訪問(wèn)應(yīng)用程序域名的任何現(xiàn)有子域。有時(shí),為了確保不會(huì)造成這種漏洞,必須修改組織所使用的各種應(yīng)用程序的域和路徑命名方案。

(8)采取特殊措施保護(hù)會(huì)話管理機(jī)制的安全。

這可以防止應(yīng)用程序用戶成為各種攻擊的目標(biāo)。

(9)嚴(yán)格審查應(yīng)用程序的代碼庫(kù)。

這可以確定并刪除任何跨站點(diǎn)腳本漏洞。許多這類漏洞可被用于攻擊會(huì)話管理機(jī)制,特別是保存型(或二階)XSS攻擊,它可對(duì)每一種會(huì)話濫用與劫持防御造成破壞。

(10)不應(yīng)接受用戶提交但服務(wù)器并不認(rèn)可的任何令牌。

應(yīng)立即在瀏覽器中取消該令牌,并將用戶返回到應(yīng)用程序的起始頁(yè)面。

(11)進(jìn)行兩步確認(rèn)或重新驗(yàn)證。

在執(zhí)行轉(zhuǎn)賬之類的重要操作之前,可有效防御跨站點(diǎn)請(qǐng)求偽造和其他會(huì)話攻擊。

(12)不完全依賴HTTP Cookies傳送會(huì)話令牌。

這樣可以防御跨站點(diǎn)請(qǐng)求偽造攻擊。使用Cookies機(jī)制會(huì)造成這種漏洞是因?yàn)闊o(wú)論什么原因提出請(qǐng)求,瀏覽器都會(huì)自動(dòng)提交Cookies。如果總是通過(guò)HTML表單隱藏字段傳送令牌,那么除非攻擊者已經(jīng)知道令牌,否則他就無(wú)法建立一個(gè)表單,再通過(guò)提交該表單執(zhí)行未授權(quán)操作。當(dāng)然,如果他已經(jīng)知道令牌,就可以輕易實(shí)施劫持攻擊。每頁(yè)面令牌也有助于防止這些攻擊。

(13)成功驗(yàn)證后應(yīng)總是建立一個(gè)新的會(huì)話。

可以避免會(huì)話固定攻擊的影響。如果應(yīng)用程序并不使用驗(yàn)證機(jī)制,但允許提交敏感數(shù)據(jù),那么會(huì)話固定攻擊造成的威脅就更難以解除。一種可能的解決辦法是使提交敏感數(shù)據(jù)的頁(yè)面序列盡可能短,并且在這個(gè)序列的第一個(gè)頁(yè)面建立一個(gè)新的會(huì)話(如有必要,從現(xiàn)有會(huì)話中復(fù)制任何需要的數(shù)據(jù),如購(gòu)物車的內(nèi)容),或者使用每頁(yè)面令牌,防止知道第一個(gè)頁(yè)面所使用的令牌攻擊者訪問(wèn)隨后的頁(yè)面。除非完全有必要,否則不得向用戶顯示個(gè)人數(shù)據(jù)。即使有必要(如顯示地址的“確認(rèn)訂單”頁(yè)面),也不得向用戶顯示信用卡號(hào)碼和密碼之類的敏感數(shù)據(jù),并且應(yīng)在應(yīng)用程序的響應(yīng)中隱藏這些數(shù)據(jù)。

(14)應(yīng)用每頁(yè)面令牌。

應(yīng)在會(huì)話令牌的基礎(chǔ)上使用每頁(yè)面令牌,對(duì)會(huì)話實(shí)施更加嚴(yán)格的控制,更有效地防御或阻斷各種會(huì)話攻擊。使用每頁(yè)面令牌時(shí),每次用戶請(qǐng)求一個(gè)應(yīng)用程序頁(yè)面(而不是圖像),應(yīng)用程序都會(huì)建立一個(gè)新的頁(yè)面令牌,并通過(guò)Cookies或HTML表單隱藏字段將其傳送給客戶。用戶每次提出一個(gè)請(qǐng)求,除通過(guò)主會(huì)話令牌進(jìn)行正常確認(rèn)外,頁(yè)面令牌還根據(jù)最后發(fā)布的令牌值進(jìn)行再次檢驗(yàn)。如果出現(xiàn)不匹配的情況,整個(gè)會(huì)話將被終止。

雖然使用每頁(yè)面令牌確實(shí)給導(dǎo)航造成一些限制(如使用“后退”和“前進(jìn)”按鈕以及多窗口瀏覽方面),但它能夠有效防御會(huì)話固定攻擊,并確保如果合法用戶和攻擊者同時(shí)使用一個(gè)被劫持的會(huì)話提出相同的請(qǐng)求,該請(qǐng)求會(huì)立即被應(yīng)用程序終止。每頁(yè)面令牌還可用于追蹤用戶的位置和在應(yīng)用程序中的活動(dòng)情況,檢測(cè)出不按預(yù)定順序訪問(wèn)某些功能的企圖,并有助于防止某些訪問(wèn)控制缺陷。

6.4.3 使用日志、監(jiān)控等輔助功能

應(yīng)用程序的會(huì)話管理功能應(yīng)與它的日志、監(jiān)控與警報(bào)機(jī)制緊密結(jié)合,以在適當(dāng)時(shí)記錄反常行為,并幫助管理員在必要時(shí)采取防御措施。應(yīng)用程序應(yīng)監(jiān)控包含無(wú)效令牌的請(qǐng)求。除非令牌很容易被預(yù)測(cè),否則,攻擊者就需要提出大量包含無(wú)效令牌的請(qǐng)求,才能成功猜測(cè)出應(yīng)用程序發(fā)布給其他用戶的令牌,從而在應(yīng)用程序的日志中留下明顯的痕跡。

很難完全阻止針對(duì)會(huì)話令牌的蠻力攻擊,因?yàn)槲覀儫o(wú)法通過(guò)禁用特殊用戶賬戶或會(huì)話來(lái)終止這種攻擊。一種可能的防御方法是在收到大量包含無(wú)效令牌的請(qǐng)求時(shí)將其來(lái)源IP地址屏蔽一段時(shí)間。然而,如果一個(gè)用戶的請(qǐng)求來(lái)自幾個(gè)IP地址(如AOL用戶),或者幾個(gè)用戶的請(qǐng)求來(lái)自同一個(gè)IP地址(如執(zhí)行網(wǎng)絡(luò)地址轉(zhuǎn)換的代理服務(wù)器或防火墻中的用戶),這種方法就不能發(fā)揮太大的作用。

即使無(wú)法立即有效防止針對(duì)會(huì)話的蠻力攻擊,但保留詳細(xì)的日志并向管理員發(fā)出警報(bào)仍然可幫助他們對(duì)攻擊進(jìn)行調(diào)查,并盡其所能采取適當(dāng)?shù)男袆?dòng)。

只要有可能,應(yīng)向用戶警告與會(huì)話有關(guān)的反常事件,如并行登錄或明顯的劫持攻擊(使用每頁(yè)面令牌檢測(cè))。即使用戶的令牌已被攻破,這樣做也可促使用戶進(jìn)行檢查,看是否發(fā)生轉(zhuǎn)賬之類的未授權(quán)操作。

那么什么又叫反應(yīng)性會(huì)話終止呢?會(huì)話管理機(jī)制可非常有效地防御許多針對(duì)應(yīng)用程序的其他攻擊。如果收到用戶提交的反常請(qǐng)求(例如,任何包含被修改的隱藏HTML表單字段或URL查詢字符串參數(shù)的請(qǐng)求、任何包含與SQL注入或跨站點(diǎn)腳本攻擊有關(guān)的字符串請(qǐng)求,以及任何正常情況下已經(jīng)被長(zhǎng)度限制之類的客戶端檢查阻止的用戶輸入),那么一些安全性至關(guān)重要的應(yīng)用程序(如電子銀行)會(huì)極其迅速地終止用戶的會(huì)話。

當(dāng)然,任何使用這類請(qǐng)求可對(duì)其加以利用的漏洞都必須從源頭進(jìn)行清除。但是,迫使用戶每次提交一個(gè)無(wú)效請(qǐng)求時(shí)都需要進(jìn)行重新驗(yàn)證會(huì)顯著延長(zhǎng)探查應(yīng)用程序漏洞所需的時(shí)間,即使采用自動(dòng)技巧完成這一任務(wù)也是如此。如果殘余的漏洞確實(shí)存在,其他人就更不可能發(fā)現(xiàn)它們。

如果執(zhí)行這種防御,為方便測(cè)試,建議在需要時(shí)將其關(guān)閉。如果在對(duì)應(yīng)用程序進(jìn)行合法滲透測(cè)試時(shí),這種防御就像是遇到真正的攻擊者那樣減緩應(yīng)用程序的響應(yīng)速度,那么它的效率就會(huì)顯著降低。與不使用這種機(jī)制相比,使用它很可能會(huì)在代碼中造成更多的漏洞。

主站蜘蛛池模板: 长汀县| 德令哈市| 横峰县| 临桂县| 柳江县| 新安县| 太康县| 威远县| 潼关县| 都兰县| 丹寨县| 白水县| 黑水县| 惠安县| 武夷山市| 尚义县| 治多县| 滨州市| 密云县| 合作市| 磐石市| 陆良县| 宝清县| 灵武市| 利川市| 马公市| 潜山县| 堆龙德庆县| 葫芦岛市| 黄骅市| 武隆县| 承德县| 无为县| 绩溪县| 阜阳市| 林芝县| 莎车县| 克拉玛依市| 腾冲县| 邻水| 噶尔县|