為防止惡意輸入,應(yīng)用程序?qū)嵤┝舜罅康陌踩珯C(jī)制,而這些安全機(jī)制在概念上都具有相似性。
這些安全機(jī)制由以下幾個(gè)方面組成:
1、處理用戶(hù)訪問(wèn)web應(yīng)用程序的數(shù)據(jù)與功能(防止未授權(quán)訪問(wèn))
2、處理用戶(hù)對(duì)web應(yīng)用程序功能輸入的數(shù)據(jù)(防止構(gòu)造惡意數(shù)據(jù))
3、應(yīng)對(duì)攻擊(處理預(yù)料外的報(bào)錯(cuò)、自動(dòng)阻止明顯的攻擊、自動(dòng)向管理員發(fā)送警報(bào)、維護(hù)程序的訪問(wèn)日志)
4、管理與維護(hù)應(yīng)用程序
處理訪問(wèn)
通常一個(gè)應(yīng)用程序的用戶(hù)有不同類(lèi)型如,普通用戶(hù)、登錄驗(yàn)證用戶(hù)、管理員。對(duì)不同用戶(hù)web應(yīng)用程序給予不同的權(quán)限,他們只能訪問(wèn)不同的數(shù)據(jù)與功能。
web應(yīng)用程序是通過(guò)三層互相關(guān)聯(lián)的安全機(jī)制來(lái)處理用戶(hù)的訪問(wèn):
1、身份驗(yàn)證(Authentication)
2、會(huì)話管理(Session Management)
3、訪問(wèn)控制(Access Control)
這三個(gè)機(jī)制處理用戶(hù)對(duì)應(yīng)用程序的訪問(wèn),同時(shí)它也是三個(gè)受攻擊面(attack surface);而且這三者相互依賴(lài)缺一不可,無(wú)論哪個(gè)地方出了問(wèn)題都會(huì)造成未授權(quán)訪問(wèn)(木桶原理)。
身份驗(yàn)證
身份驗(yàn)證是處理用戶(hù)訪問(wèn)的第一道機(jī)制,除非網(wǎng)站只有一種用戶(hù),否則必須使用身份驗(yàn)證。
如今web應(yīng)用程序大都使用傳統(tǒng)身份驗(yàn)證模型,即用戶(hù)名密碼。
在銀行等安全性較高的應(yīng)用程序中會(huì)使用其他證書(shū)、雙因素認(rèn)證等來(lái)強(qiáng)化這個(gè)模型;在安全性要求更高的應(yīng)用程序中可能需要客戶(hù)端證書(shū)、智能卡或詢(xún)問(wèn)-應(yīng)答機(jī)制等其他身份驗(yàn)證模型。
身份驗(yàn)證機(jī)制往往還需要一系列其他支持功能,如注冊(cè)、忘記密碼、修改密碼等。
身份驗(yàn)證機(jī)制存在一些普遍的漏洞,如遍歷用戶(hù)名、弱口令、邏輯缺陷避開(kāi)登錄、社工庫(kù)查詢(xún)等等。
會(huì)話管理
通過(guò)驗(yàn)證之后,就是管理用戶(hù)的會(huì)話了。為了實(shí)施訪問(wèn)控制,應(yīng)用程序需要識(shí)別不同用戶(hù)提交的各種請(qǐng)求;為此,應(yīng)用程序需要為每個(gè)用戶(hù)建立一個(gè)會(huì)話,并向用戶(hù)發(fā)送一個(gè)表示會(huì)話的令牌即session token。會(huì)話本身是保存在服務(wù)器上的一組數(shù)據(jù)結(jié)構(gòu),用于追蹤用戶(hù)和應(yīng)用程序的交互狀態(tài)。
會(huì)話令牌一般在cookie中傳遞,有時(shí)也會(huì)出現(xiàn)在隱藏表單字段或者url查詢(xún)字符串上,會(huì)話令牌會(huì)在停止請(qǐng)求后一段時(shí)間內(nèi)失效。
有些應(yīng)用程序不使用會(huì)話令牌來(lái)識(shí)別會(huì)話,而是通過(guò)反復(fù)提交用戶(hù)證書(shū)識(shí)別會(huì)話(http內(nèi)置身份驗(yàn)證機(jī)制就是這樣,通過(guò)反復(fù)提交通過(guò)base64加密的賬號(hào)密碼來(lái)識(shí)別會(huì)話)。在一些情況下會(huì)話信息不保存在服務(wù)器上,而是保存在客戶(hù)端,為了防止用戶(hù)修改,一般會(huì)對(duì)其進(jìn)行加密。
會(huì)話管理的受攻擊面就是會(huì)話令牌本身,推測(cè)出會(huì)話令牌的生成規(guī)則或者截獲到其他用戶(hù)的會(huì)話令牌便可以以他人身份訪問(wèn)未經(jīng)授權(quán)的功能與數(shù)據(jù)。
訪問(wèn)控制
如果前面的身份驗(yàn)證與會(huì)話管理運(yùn)行正常,應(yīng)用程序便可以通過(guò)每個(gè)請(qǐng)求中的會(huì)話令牌確認(rèn)每個(gè)用戶(hù)的身份與交互狀態(tài),于是便可決定是否同意用戶(hù)的請(qǐng)求。
因?yàn)榈湫驮L問(wèn)控制的要求比較復(fù)雜,每個(gè)角色有不同的權(quán)限,每個(gè)用戶(hù)只允許訪問(wèn)應(yīng)用程序中的一部分?jǐn)?shù)據(jù)與功能,因此這個(gè)機(jī)制中一般存在大量漏洞,可以造成未授權(quán)訪問(wèn)。
處理輸入
所有的用戶(hù)輸入都不可信,大部分對(duì)web應(yīng)用程序的攻擊都與攻擊者專(zhuān)門(mén)構(gòu)造的輸入有關(guān),所以安全的處理用戶(hù)的輸入是保障應(yīng)用程序安全的關(guān)鍵。
輸入的多樣性
web應(yīng)用程序可能對(duì)一些特殊的輸入執(zhí)行非常嚴(yán)格的檢查,例如長(zhǎng)度限制、字符限制等;有時(shí)候則可能需要接受用戶(hù)提交的任意輸入;而隱藏表單字段和cookie等是在服務(wù)器上生成傳回客戶(hù)端,再由用戶(hù)的請(qǐng)求傳回服務(wù)器,在這個(gè)過(guò)程中攻擊者卻可以查看并修改它們。
輸入處理方法
不同的情況使用不同的處理方法,或者搭配使用。
1、黑名單
黑名單包含一組在攻擊中會(huì)使用的字符串或模式,所有與黑名單匹配的數(shù)據(jù)都會(huì)阻止。
黑名單是輸入確認(rèn)效果最差的方法。原因有二:
1)用戶(hù)的輸入可以通過(guò)各種編碼或者其他的表現(xiàn)形式進(jìn)行繞過(guò),比如遺漏一些有相同作用的字符。例如alert(‘xss’)被阻止,還可以使用prompt(‘xss’)、例如web應(yīng)用防火墻常受到空字節(jié)(null)攻擊,這是因?yàn)樵谕泄芘c非托管情況下處理字符串的方式不同。
2)術(shù)飛速的發(fā)展,使之產(chǎn)生一些新型的漏洞利用方法。
2、白名單
白名單包含一組良性的字符串、模式或一組標(biāo)準(zhǔn)。所有不與白名單匹配的數(shù)據(jù)都會(huì)被阻止。
白名單是輸入確認(rèn)效果最好的方法,因?yàn)橹付ò酌麊螘r(shí)只會(huì)留下安全的字符串,攻擊者無(wú)法構(gòu)造輸入。
但是白名單具有局限性。在許多情況下web應(yīng)用程序必須接受一些不符合安全標(biāo)準(zhǔn)的字符,例如應(yīng)用程序需要用戶(hù)以真實(shí)姓名注冊(cè),但是姓名中卻包含一些連字符、撇號(hào)等可能對(duì)數(shù)據(jù)庫(kù)造成攻擊的字符。所以白名單具有局限性,并非解決不安全輸入的萬(wàn)能方法。
3、凈化
這種方式解決了白名單無(wú)法處理的部分,它接受一些無(wú)法保證安全的數(shù)據(jù)輸入,但是會(huì)對(duì)其進(jìn)行凈化,例如刪除、轉(zhuǎn)義、編碼等
凈化可以作為一種通用的方法,但是需要注意的是如果一個(gè)輸入項(xiàng)中需要容納幾種可能的惡意數(shù)據(jù),就很能對(duì)其進(jìn)行有效的進(jìn)化。這時(shí)需要使用邊界確認(rèn)。
4、安全數(shù)據(jù)處理
以不安全的方式處理用戶(hù)提交的數(shù)據(jù),是許多web應(yīng)用程序漏洞形成的根本原因。
安全的數(shù)據(jù)處理方式,不需要糾結(jié)于對(duì)用戶(hù)輸入數(shù)據(jù)的確認(rèn),轉(zhuǎn)而確保處理過(guò)程的絕對(duì)安全。例如防止sql注入的參數(shù)化查詢(xún)。
但是這項(xiàng)方法不適用于web應(yīng)用程序需要執(zhí)行的每一項(xiàng)任務(wù),如果適用,它就是處理惡意輸入的通用處理方法了。
5、邏輯檢查
在一些漏洞中攻擊者與正常用戶(hù)的輸入完全相同,僅僅是動(dòng)機(jī)不同,在這種情況下,以上機(jī)制幾乎完全無(wú)效。例如攻擊這通過(guò)修改隱藏表單字段提交的賬號(hào),企圖訪問(wèn)其他用戶(hù)賬號(hào)。此時(shí)再多的輸入確認(rèn)也無(wú)法區(qū)別攻擊者與正常用戶(hù)的數(shù)據(jù)。為防止未授權(quán)訪問(wèn),應(yīng)用程序必須確認(rèn)所提交賬號(hào)屬于之前提交該賬號(hào)的用戶(hù)。
邊界確認(rèn)
鑒于核心安全問(wèn)題的本質(zhì)(所有用戶(hù)輸入皆不可信),可以將因特網(wǎng)(不可信)與服務(wù)器應(yīng)用程序(可信)之間作為邊界,然后在邊界凈化所有來(lái)自因特網(wǎng)的輸入,將凈化后的數(shù)據(jù)交給服務(wù)器應(yīng)用程序。以上,是一種簡(jiǎn)單的邊界確認(rèn),在分析實(shí)際的漏洞時(shí)發(fā)現(xiàn)執(zhí)行這種簡(jiǎn)單的輸入確認(rèn)是不夠的。
基于應(yīng)用程序執(zhí)行功能的廣泛性及其采用技術(shù)的多樣性,一個(gè)典型的應(yīng)用程序需要防御大量的各種各樣的輸入攻擊,每種攻擊可能采用一種截然不同的專(zhuān)門(mén)設(shè)計(jì)的數(shù)據(jù),因此很難在外部邊界建立一個(gè)簡(jiǎn)單的機(jī)制防御所有的攻擊。
許多應(yīng)用程序功能都設(shè)計(jì)組合一系列不同的處理過(guò)程,用戶(hù)的一個(gè)輸入,可能在許多組件中執(zhí)行許多操作,其中前一個(gè)操作的輸出結(jié)果被用于后一個(gè)操作。數(shù)據(jù)經(jīng)過(guò)轉(zhuǎn)換后與原始輸入完全不同。而經(jīng)驗(yàn)豐富的攻擊者卻能利用這種不同,在關(guān)鍵步驟生成惡意數(shù)據(jù),攻擊接受數(shù)據(jù)的組件。因此很難在外部邊界建立一個(gè)簡(jiǎn)單的機(jī)制防御所有的攻擊。
邊界確認(rèn)是一種更加有效的模型。這里的邊界不在局限于因特網(wǎng)與web應(yīng)用程序之間的邊界,web應(yīng)用程序的每個(gè)組件或功能單元都有邊界。如此,每個(gè)組件都可以防御它收到的特殊類(lèi)型的專(zhuān)門(mén)設(shè)計(jì)的輸入。當(dāng)數(shù)據(jù)通過(guò)不同的組件,即可對(duì)前面生成的數(shù)據(jù)執(zhí)行確認(rèn)檢查,而且由于不同的處理階段執(zhí)行不同的確認(rèn)檢查,它們之間不可能發(fā)生沖突。
例如下圖:
多步確認(rèn)與規(guī)范化
在確認(rèn)檢查過(guò)程中,當(dāng)需要在幾個(gè)步驟中處理用戶(hù)的輸入時(shí),就會(huì)出現(xiàn)一個(gè)輸入機(jī)制經(jīng)常遇到的問(wèn)題。當(dāng)應(yīng)用程序試圖通過(guò)刪除或者編碼某些字符達(dá)到凈化用戶(hù)輸入時(shí),就會(huì)出現(xiàn)這種問(wèn)題。如果不謹(jǐn)慎處理這個(gè)問(wèn)題,攻擊者就能構(gòu)造專(zhuān)門(mén)的輸入,使惡意數(shù)據(jù)成功避開(kāi)確認(rèn)機(jī)制。例如雙寫(xiě)繞過(guò)、利用步驟執(zhí)行順序繞過(guò)。
數(shù)據(jù)規(guī)范化會(huì)造成另一個(gè)問(wèn)題。為了通過(guò)http傳送一些不常見(jiàn)的字符和二進(jìn)制數(shù)據(jù),通常會(huì)通過(guò)編碼對(duì)其進(jìn)行規(guī)范化,但是如何在實(shí)施過(guò)濾之后才進(jìn)行解碼,攻擊者就可以通過(guò)編碼避開(kāi)確認(rèn)機(jī)制。
除了供web應(yīng)用程序使用的標(biāo)準(zhǔn)編碼方案外,其他情況下,如果應(yīng)用程序的組件將數(shù)據(jù)從一個(gè)字符集轉(zhuǎn)換為另一個(gè)字符集,這也會(huì)導(dǎo)致規(guī)范化問(wèn)題。例如?和?則被轉(zhuǎn)換為Y和A,攻擊者經(jīng)常使用這種方法傳送受阻止的字符和關(guān)鍵字。
有時(shí)候很難避免多步確認(rèn)和規(guī)范化造成的問(wèn)題,也不存在解決和這類(lèi)問(wèn)題的唯一方案。如何可能一般避免凈化不良輸入,而是完全拒絕這種輸入。
應(yīng)對(duì)攻擊
以上我們已經(jīng)盡可能的阻止了攻擊者的入侵,但是沒(méi)有一個(gè)絕對(duì)安全的系統(tǒng),若發(fā)生安全事件web應(yīng)用程序應(yīng)當(dāng)如何應(yīng)對(duì)攻擊呢,處理措施一般為以下幾條:
1、處理預(yù)料外的報(bào)錯(cuò)
2、自動(dòng)阻止明顯的攻擊
3、自動(dòng)向管理員發(fā)送警報(bào)
4、維護(hù)程序的訪問(wèn)日志
處理錯(cuò)誤
應(yīng)用程序的一個(gè)關(guān)鍵機(jī)制就是如何處理意料之外的錯(cuò)誤。一般在生產(chǎn)環(huán)境下,應(yīng)用程序不應(yīng)該向用戶(hù)返回任何系統(tǒng)生成的信息或者其他調(diào)試信息。這些信息對(duì)于攻擊者而言是為下一步的進(jìn)攻提供了很好的參考信息。而且意料之外的錯(cuò)誤往往指明了程序的防御機(jī)制中的一些缺陷。錯(cuò)誤處理機(jī)制通常與日志機(jī)制整合在一起。
應(yīng)對(duì)攻擊
很多攻擊都會(huì)發(fā)送大量的常見(jiàn)惡意字符,遇到這類(lèi)情況應(yīng)用程序應(yīng)采取自動(dòng)反應(yīng)措施阻止攻擊者的探查。例如終止會(huì)話、要求重新登錄、禁止ip等等
維護(hù)日志
日志會(huì)對(duì)入侵情況進(jìn)行記錄,入侵過(guò)后仍能還原入侵過(guò)程。
重要的應(yīng)用程序日志應(yīng)記錄所有請(qǐng)求。一般情況下應(yīng)至少包括一下幾項(xiàng):
1、所有與身份驗(yàn)證相關(guān)的事件,如成功或失敗的登錄、密碼修改
2、關(guān)鍵操作,如轉(zhuǎn)賬等
3、被訪問(wèn)控制阻止的請(qǐng)求
4、包含已知攻擊字符串
日志會(huì)記錄每個(gè)事件的時(shí)間、ip、用戶(hù)賬戶(hù)。日志需要嚴(yán)格保護(hù),避免未授權(quán)的讀取。寫(xiě)入,修改等等
日志同樣也會(huì)成為一個(gè)攻擊面,例如可以未授權(quán)訪問(wèn)的日志會(huì)為攻擊者提供會(huì)話令牌、請(qǐng)求參數(shù)等等敏感信息。
向管理員發(fā)出警報(bào)
核心問(wèn)題就是誤報(bào)和漏報(bào),將警報(bào)機(jī)制與確認(rèn)機(jī)制和其他控制方法結(jié)合起來(lái)可以得到一些改善。
一般而言監(jiān)控到的反常事件包括以下幾種:
1、應(yīng)用反常,如接收到一個(gè)ip的大量的請(qǐng)求
2、交易反常,如一個(gè)銀行賬戶(hù)所轉(zhuǎn)入轉(zhuǎn)出的資金數(shù)量出現(xiàn)異常
3、包含已知攻擊字符串
4、請(qǐng)求中普通用戶(hù)無(wú)法查看的數(shù)據(jù)被修改
管理應(yīng)用程序
管理程序可以幫助管理員管理用戶(hù)賬戶(hù)與角色、應(yīng)用監(jiān)控與審計(jì)功能、執(zhí)行診斷任務(wù)并配置應(yīng)用程序的各種功能。
管理機(jī)制是應(yīng)用程序主要受攻擊面之一,管理機(jī)制往往都擁有很高的權(quán)限。獲得了管理機(jī)制控制權(quán),就是獲得了應(yīng)用程序的控制權(quán)。而且管理機(jī)制中往往會(huì)存在一些比較明顯的漏洞和敏感的功能。獲得管理員的權(quán)限的漏洞一般出現(xiàn)在處理用戶(hù)訪問(wèn)機(jī)制上,如未授權(quán)訪問(wèn)、弱口令等,如果管理后臺(tái)可以處理普通用戶(hù)發(fā)送的請(qǐng)求,可以嘗試xss漏洞盲打后臺(tái)。