Web安全漏洞可以分為兩類(lèi):一類(lèi)包括平臺(tái)的安全漏洞,另一類(lèi)是應(yīng)用自身的安全漏洞。
1.1.1 Web平臺(tái)的安全漏洞
Web平臺(tái)自身的安全漏洞——許多Web應(yīng)用程序共享的部分,例如Linux、Windows、Apaehe和oraele等。它們扮演著以下角色:
n Web服務(wù)器 這一部分為用戶瀏覽器提供Web頁(yè)面。最常用的例子就是Apache和IIS。每種Web服務(wù)器都有一系列安全漏洞。
n 應(yīng)用服務(wù)器 這一部分包括用戶操作、解釋、提供數(shù)據(jù)。應(yīng)用服務(wù)器可以是Web服務(wù)器的一部分,例如PHP和Apache、ASP.NET和IIS。另一方面,應(yīng)用服務(wù)器可以是物理上獨(dú)立的服務(wù)器,例如Tomcat Servlet引擎。每種Web應(yīng)用服務(wù)器同樣有一系列安全漏洞。
n 數(shù)據(jù)庫(kù) 這一部分存儲(chǔ)應(yīng)用所需的全部數(shù)據(jù)。盡管用戶能夠與Web和應(yīng)用服務(wù)器交互,但他們通常不能直接訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器。大多數(shù)情況下,應(yīng)用務(wù)器代理用戶和數(shù)據(jù)庫(kù)之間的數(shù)據(jù),并格式化數(shù)據(jù)使之能夠正確存儲(chǔ)。每種數(shù)據(jù)庫(kù)服務(wù)器也都有一系列安全漏洞。
Web應(yīng)用自身的安全漏洞,即Web站點(diǎn)中的編程錯(cuò)誤引起的暴露用戶的詳細(xì)息、允許惡意用戶執(zhí)行任意的數(shù)據(jù)庫(kù)查詢,甚至允許通過(guò)遠(yuǎn)程命令行訪問(wèn)服務(wù)。
1.1.2 web應(yīng)用程序漏洞
基于Web的應(yīng)用程序漏洞是錯(cuò)綜復(fù)雜的,常見(jiàn)的Web應(yīng)用程序漏洞有以下大類(lèi)。
Ø 跨站點(diǎn)腳本攻擊
XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁(yè)面里插入惡意html代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web里面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意用戶的特殊目的。
Web頁(yè)面經(jīng)常在應(yīng)用程序的某個(gè)地方對(duì)用戶的輸入進(jìn)行回顯。一般在預(yù)先設(shè)計(jì)好的某個(gè)特定域中輸入純文本才能被回顯,但是HTML并不僅僅支持純文本,還可以包含多種客戶端的腳本代碼,以此來(lái)完成許多操作,諸如驗(yàn)證表單數(shù)據(jù),或者提供動(dòng)態(tài)的用戶界面元素。
Ø SQL Injection攻擊
SQL命令就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。
SQL命令即為應(yīng)用系統(tǒng)前端Web和后端數(shù)據(jù)庫(kù)之間的接口,使得數(shù)據(jù)可以傳遞至Web應(yīng)用程序,也可以從其中發(fā)送出來(lái)。很多Web站點(diǎn)都會(huì)利用用戶輸入的參數(shù)動(dòng)態(tài)的生成SQL查詢要求,攻擊通過(guò)在URL、表格域,或者其他的輸入域中輸入自已的SQL命令,以此改變查詢屬性騙過(guò)應(yīng)用程序,從而可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行不受限制的訪問(wèn)。
Ø 物理路徑泄露漏洞
物理路徑泄露,即攻擊者可能利用此漏洞得到的信息對(duì)系統(tǒng)進(jìn)行進(jìn)一步的攻擊,提供Web、FTP、SMTP等公共服務(wù)器都可能出現(xiàn)物理路徑泄露的問(wèn)題。
物理路徑泄露屬于低風(fēng)險(xiǎn)等級(jí)缺陷,它的危害一般被描述為“攻擊者可以利用此漏洞得到信息,來(lái)對(duì)系統(tǒng)進(jìn)一步地攻擊”。導(dǎo)致Web服務(wù)器路徑泄露的原因有很多,可能是Web平臺(tái)本身、腳本語(yǔ)言解釋器、引擎插件、組件、輔助程序等一些原因錯(cuò)誤導(dǎo)致的。很多時(shí)候Web服務(wù)器路徑泄露漏洞是由于Web服務(wù)器處理用戶請(qǐng)求出錯(cuò)導(dǎo)致的,如通過(guò)提交一個(gè)超長(zhǎng)的請(qǐng)求,或者是某個(gè)精心構(gòu)造的特殊請(qǐng)求,或者是請(qǐng)求一個(gè)Web服務(wù)器上不存在的文件。這些請(qǐng)求都有一個(gè)共同特點(diǎn),那就是被請(qǐng)求的文件肯定屬于CGI腳本,而不是靜態(tài)HTML頁(yè)面。比如,提交一個(gè)不存在的CGI文件請(qǐng)求,或者提交一個(gè)沒(méi)有輸出的CGI文件的請(qǐng)求,請(qǐng)求返回結(jié)果將會(huì)把網(wǎng)站本身所在的物理路徑給暴露出來(lái)。
另一種類(lèi)型的Web服務(wù)器路徑泄露漏洞是由于Web服務(wù)器的某些顯示環(huán)境變量的程序錯(cuò)誤輸出了Web服務(wù)器的物理路徑。
同時(shí),在Web應(yīng)用網(wǎng)站開(kāi)發(fā)過(guò)程中,程序員沒(méi)有合理應(yīng)用編程語(yǔ)言提供的出錯(cuò)處理函數(shù)。例如Perl中的“die”函數(shù),如果沒(méi)有在錯(cuò)誤信息后面加上“\n”的話,就很可能會(huì)導(dǎo)致物理路徑泄露。
Ø 源代碼泄露漏洞
源代碼泄露漏洞的產(chǎn)生是由于輸入驗(yàn)證錯(cuò)誤引起的。
以IIS為例,IIS是通過(guò)文件擴(kuò)展名來(lái)決定將一個(gè)文件內(nèi)容直接顯示出來(lái)還是作為腳本執(zhí)行的。對(duì)于ASP文件,如果請(qǐng)求中的擴(kuò)展名是“.asp”那么IIS可以正確處理。如果將擴(kuò)展名后面加一個(gè)“%81”,IIS將不認(rèn)為這是一個(gè)ASP文件,也就不會(huì)執(zhí)行。但是文件系統(tǒng)會(huì)忽略文件名后的“%81”,可以正確找到文件。例如請(qǐng)求URL為:http://www.megamoneycorp.com/getreport.asp?item=Q1-2005.htm,則可以構(gòu)造URL:http://www.megamoneycorp.com/getreport.asp?item=getreport.asp,以顯示源代碼。
Ø 目錄遍歷漏洞
目錄遍歷攻擊指的是惡意用戶找到受限文件的位置并且瀏覽或者執(zhí)行它們。
Web服務(wù)器程序(包括Web應(yīng)用程序)就是向用戶提供包含動(dòng)態(tài)或者靜態(tài)頁(yè)面,這些頁(yè)面都存儲(chǔ)在Web服務(wù)器中。Web服務(wù)器和Web應(yīng)用程序的作用就是對(duì)這些頁(yè)面進(jìn)行處理并將其發(fā)送到客戶機(jī)上,同時(shí)將正在訪問(wèn)的用戶限制在表示Web內(nèi)容的文件中,而且還需要阻止攻擊者瀏覽和執(zhí)行Web服務(wù)器上的任何其它文件。目錄遍歷主要使用猜測(cè)文件是否存在的方法進(jìn)行。
Ø 執(zhí)行任意命令
執(zhí)行任意命令即執(zhí)行任意操作系統(tǒng)命令,主要包括兩種情況:一是通過(guò)遍歷目錄,如二次解碼和UNICODE解碼漏洞,來(lái)執(zhí)行系統(tǒng)命令;另外一種就是Web服務(wù)器把用戶提交的請(qǐng)求作為SSI指令解析,因此導(dǎo)致執(zhí)行任意命令。
在Web發(fā)展的早期,程序員利用C語(yǔ)言或者Perl語(yǔ)言編寫(xiě)Web應(yīng)用程序,存放于Unix服務(wù)器上。這個(gè)理念就是編寫(xiě)短小的應(yīng)用程序,并且將他們連接起來(lái),完成更復(fù)雜的功能。在安全方面,當(dāng)數(shù)據(jù)被傳送到一個(gè)不同環(huán)境的其他組件中時(shí),會(huì)對(duì)Web服務(wù)器造成很大的安全漏洞,使得攻擊變得異常的容易。這種攻擊背后的思想就是運(yùn)行自已輸入的命令,而不是按照開(kāi)發(fā)人員預(yù)期的那樣,執(zhí)行某個(gè)指定的程序。
攻擊這種漏洞的目標(biāo)是發(fā)送到服務(wù)器上的操作系統(tǒng)命令或者可執(zhí)行程序的用戶輸入。這些輸入域的一部分會(huì)常出現(xiàn)在應(yīng)用程序的參數(shù)中,這些參數(shù)可能是頁(yè)面中包含的一些被引用的文件,也可能是其他程序的參數(shù)。
Ø 緩沖區(qū)溢出漏洞
緩沖區(qū)溢出攻擊是指在擾亂具有某些特權(quán)運(yùn)行的程序的功能的前提下,使得攻擊者取得程序的控制權(quán),如果該程序具有足夠的權(quán)限,那么整個(gè)主機(jī)就被控制了。一般而言,攻擊者攻擊root程序,然后執(zhí)行類(lèi)似“exec(sh)”的執(zhí)行代碼來(lái)獲得root的shell,但不一直是這樣的。為了達(dá)到這個(gè)目的,攻擊者必須達(dá)到如下的兩個(gè)目標(biāo):(1)在程序的地址空間里安排適當(dāng)?shù)拇a。 (2)通過(guò)適當(dāng)?shù)爻跏蓟拇嫫骱痛鎯?chǔ)器,讓程序跳轉(zhuǎn)到我們安排的地址空間執(zhí)行。由于這類(lèi)攻擊使任何人都有可能取得主機(jī)的控制權(quán),所以它代表了一類(lèi)極其嚴(yán)重的安全威脅。
緩沖區(qū)溢出是針對(duì)Web應(yīng)用最嚴(yán)重的一種攻擊,當(dāng)程序無(wú)法檢查正在處理的數(shù)據(jù)輸入量時(shí)就有可能發(fā)生緩沖區(qū)溢出問(wèn)題,如果輸入的數(shù)據(jù)量超過(guò)了程序?yàn)槠浞峙涞膬?nèi)存空間的大小,它就會(huì)侵占其他程序堆棧的內(nèi)存空間,這些內(nèi)存中原有的其他數(shù)據(jù)就會(huì)被覆蓋。大多數(shù)情況下,這些被覆蓋的數(shù)據(jù)會(huì)導(dǎo)致軟件崩潰。
Ø 拒絕服務(wù)攻擊
服務(wù)拒絕攻擊企圖通過(guò)使你的服務(wù)計(jì)算機(jī)崩潰或把它壓跨來(lái)阻止你提供服務(wù)Q929230,服務(wù)拒絕攻擊是最容易實(shí)施的攻擊行為,主要包括:死亡之ping (ping of death)、淚滴(teardrop)、SYN洪水(SYN flood)、Land攻擊、Smurf攻擊、 Fraggle攻擊、 電子郵件炸彈、畸形消息攻擊等。
拒絕服務(wù)攻擊思想是,代碼的執(zhí)行總是需要時(shí)間的,每次調(diào)用函數(shù),或者是由Web服務(wù)器或者是由應(yīng)用程序或者是由數(shù)據(jù)庫(kù),函數(shù)執(zhí)行的過(guò)程中總要耗費(fèi)一定的處理器周期。如果執(zhí)行過(guò)程需要很長(zhǎng)的時(shí)間,并且操作系統(tǒng)無(wú)法將其切換到其他的程序上,服務(wù)器就會(huì)被束縛在為一個(gè)請(qǐng)求進(jìn)行服務(wù)的過(guò)程中。
Ø CGI漏洞攻擊
CGI 是 Common Gateway Interface 的縮寫(xiě),是服務(wù)器端和用戶溝通的程序,使得外部程序能生成HTML、圖像或者其他內(nèi)容,而服務(wù)器處理的方式與那些非外部程序生成的HTML、圖像或其他內(nèi)容的處理方式是相同的。
CGI程序是交互性的,它允許用戶把自已的數(shù)據(jù)按照一定的格式發(fā)送給服務(wù)器,然后由服務(wù)器對(duì)其進(jìn)行解釋,之后再把解釋的結(jié)果傳給用戶,如果用戶提交了一些非正常的數(shù)據(jù),那么服務(wù)器在解釋這些數(shù)據(jù)時(shí)可能會(huì)繞過(guò)IIS對(duì)文件名所作的安全檢查,在某些條件下,攻擊者可以執(zhí)行任意系統(tǒng)命令。
Ø 被破壞的認(rèn)證和會(huì)話管理
被破壞的認(rèn)證和會(huì)話管理(Broken Authentieation and Session Mangement):授權(quán)和會(huì)話管理包括處理用戶授權(quán)和管理激活態(tài)的會(huì)話的所有方面。
授權(quán)是這個(gè)過(guò)程的關(guān)鍵方面,但是即使是固有的授權(quán)驗(yàn)證也有可能遭到含有漏洞的信任管理功能破壞。這些固有的授權(quán)驗(yàn)證包含修改密碼、忘記密碼、記住密碼、賬號(hào)更新和其它更新功能。在網(wǎng)絡(luò)中,通常的用戶授權(quán)包括userID和密碼的使用。功能更為強(qiáng)大的授權(quán)方法包括基于密碼標(biāo)記或者統(tǒng)計(jì)的軟件和硬件,但是這種機(jī)制對(duì)于大多數(shù)的網(wǎng)絡(luò)應(yīng)用程序而言是一筆無(wú)法負(fù)擔(dān)的開(kāi)銷(xiāo)。大多數(shù)的賬戶和會(huì)話管理漏洞可能導(dǎo)致對(duì)于用戶或者系統(tǒng)管理員賬號(hào)的破壞。開(kāi)發(fā)團(tuán)隊(duì)通常會(huì)低估設(shè)計(jì)這些保障網(wǎng)站信任授權(quán)和會(huì)話管理方案的復(fù)雜性,網(wǎng)絡(luò)應(yīng)用程序必須建立會(huì)話來(lái)跟蹤每個(gè)用戶的請(qǐng)求數(shù)據(jù)流。HTTP并不提供這方面的能力,所以網(wǎng)絡(luò)應(yīng)用程序必須自己創(chuàng)建它們。
Ø 不當(dāng)異常處理
不當(dāng)異常處理(Improper Error Handling)可能給網(wǎng)站帶來(lái)各種各樣的安全問(wèn)題。最常見(jiàn)的問(wèn)題就是向用戶顯示內(nèi)部出錯(cuò)信息,如果這些出錯(cuò)信息不加選擇都展現(xiàn)到用戶面前,那么就可能公開(kāi)了本不應(yīng)該公開(kāi)的細(xì)節(jié)。這些細(xì)節(jié)可能為攻擊者提供網(wǎng)站潛在漏洞的重要線索,并且這類(lèi)信息也會(huì)干擾到正常用戶。
在正常操作時(shí),Web應(yīng)用程序也會(huì)生成一些出錯(cuò)情況,內(nèi)存不夠、空指針異常、系統(tǒng)調(diào)用失敗、數(shù)據(jù)庫(kù)不存在、網(wǎng)絡(luò)超時(shí)等。這些錯(cuò)誤必須被一個(gè)即定的嚴(yán)密方案正確地處理,從而為用戶提供一份有意義的出錯(cuò)信息,為Web應(yīng)用維護(hù)人員提供診斷信息,而不是為攻擊者提供有用的信息。有時(shí)即使出錯(cuò)信息不能提供過(guò)多的細(xì)節(jié),出錯(cuò)信息的差異也會(huì)把該Web應(yīng)用是如何工作的這樣重要的信息暴露出來(lái):并且暴露了那些出錯(cuò)信息背后的隱含意義。例如,當(dāng)一個(gè)用戶試圖訪問(wèn)一份他無(wú)權(quán)訪問(wèn)的文件時(shí),通常出錯(cuò)信息會(huì)給出如下提示“訪問(wèn)被拒絕”,這種區(qū)別可能會(huì)暴露這個(gè)文件是否存在,或者這個(gè)Web應(yīng)用的目錄結(jié)構(gòu)。
Ø 不安全的存儲(chǔ)
大多數(shù)Web應(yīng)用程序都需要存儲(chǔ)敏感的信息,它們或者將信息存儲(chǔ)到數(shù)據(jù)庫(kù)中,或者將信息存儲(chǔ)到文件系統(tǒng)的某個(gè)位置上。通常,人們使用加密技術(shù)來(lái)保護(hù)這些敏感的信息,雖然加密技術(shù)已經(jīng)很容易使用,但是開(kāi)發(fā)人員還是常常在將加密技術(shù)和應(yīng)用程序相結(jié)合的時(shí)候出錯(cuò)。開(kāi)發(fā)人員可能過(guò)高地估計(jì)了加密技術(shù)所帶來(lái)的安全度,并且他們不會(huì)像留意網(wǎng)站中其它部分的安全那樣注意存儲(chǔ)部分的安全。經(jīng)常出錯(cuò)的幾個(gè)地方包括:
n 未對(duì)關(guān)鍵數(shù)據(jù)進(jìn)行加密;
n 密鑰、證書(shū)和密碼的不安全存放;
n 在內(nèi)存中不恰當(dāng)?shù)乇4骊P(guān)鍵信息;
n 不當(dāng)?shù)碾S機(jī)資源;
n 不當(dāng)?shù)乃惴ㄟx擇;
n 一種新開(kāi)發(fā)的加密算法;
n 當(dāng)密鑰更改或者其它必備的維護(hù)過(guò)程發(fā)生時(shí),無(wú)法提供最新的技術(shù)支持。
Ø 不安全的配置管理
Web應(yīng)用程序服務(wù)器的配置對(duì)于Web應(yīng)用程序的安全起到了關(guān)鍵作用。許多應(yīng)用程序服務(wù)器提供了Web應(yīng)用程序能夠使用的服務(wù),例如數(shù)據(jù)存儲(chǔ)、目錄服務(wù)、郵件、信息處理等等,沒(méi)有合理配置的服務(wù)器很可能導(dǎo)致各種安全問(wèn)題。
一般說(shuō)來(lái),網(wǎng)絡(luò)開(kāi)發(fā)小組和網(wǎng)站管理小組的工作是各自獨(dú)立的,Web應(yīng)用程序的安全要求兩者共同努力,并且需要其中的成員都能夠保障系統(tǒng)Web應(yīng)用程序的安全。許多服務(wù)器的配置問(wèn)題妨礙了安全性,它們包括:
n 服務(wù)器軟件漏洞或者錯(cuò)誤的配置允許列出目錄和進(jìn)行目錄遍歷;
n 沒(méi)必要的缺省、備份或者例子文件;
n 服務(wù)器軟件未打補(bǔ)丁的漏洞;
n 不當(dāng)?shù)奈募湍夸浽L問(wèn)權(quán)限;
n 沒(méi)有必要的服務(wù),包括內(nèi)容管理和遠(yuǎn)程管理;
n 使用缺省密碼和賬號(hào);
n 被激活的、可以被訪問(wèn)的管理或者調(diào)試功能;
n 使用缺省證書(shū);
n 通過(guò)外部系統(tǒng)的不正確授權(quán);
n 錯(cuò)誤配置的SSL證書(shū)和加密設(shè)置。
上述問(wèn)題一旦被檢測(cè)出來(lái),可能會(huì)被很快攻克并且造成網(wǎng)站的巨大破壞,得逞的攻擊也能給網(wǎng)站的備份系統(tǒng)(包括數(shù)據(jù)庫(kù)和其它相關(guān)的網(wǎng)站)造成很大損害。
Ø 競(jìng)爭(zhēng)條件
競(jìng)爭(zhēng)條件是指,當(dāng)由于事件次序異常而造成對(duì)同一資源的競(jìng)爭(zhēng),從而導(dǎo)致程序無(wú)法正常運(yùn)行時(shí),就會(huì)出現(xiàn)“競(jìng)爭(zhēng)條件”。該漏洞通常為設(shè)計(jì)問(wèn)題,典型的有Ptrace漏洞、廣泛存在的文件操作時(shí)序競(jìng)爭(zhēng)。
競(jìng)爭(zhēng)條件無(wú)需介入同一程序的兩個(gè)部分之間的競(jìng)爭(zhēng);如果一個(gè)外部的攻擊者可以通過(guò)意想不到的方式干擾程序,那么就會(huì)出現(xiàn)很多安全問(wèn)題。條件競(jìng)爭(zhēng)主要針對(duì)一些管理服務(wù)器而言,這類(lèi)服務(wù)器一般是以system或root身份運(yùn)行的。當(dāng)它們需要使用一些臨時(shí)文件,而在對(duì)這些文件進(jìn)行寫(xiě)操作之前,卻沒(méi)有對(duì)文件的屬性進(jìn)行檢查,一般可能導(dǎo)致重要系統(tǒng)文件被重寫(xiě),甚至獲得系統(tǒng)控制權(quán)。
Ø 未驗(yàn)證的輸入
Web應(yīng)用程序一般是根據(jù)HTTP請(qǐng)求中用戶的輸入決定如何響應(yīng),攻擊者能夠利用HTTP請(qǐng)求中的任何一部分,包括URL、請(qǐng)求字符串(Qurey String)、cookie頭部、表單項(xiàng),隱含參數(shù)傳遞代碼來(lái)發(fā)動(dòng)攻擊。
一些網(wǎng)站使用過(guò)濾器過(guò)濾掉惡意輸入,但是對(duì)于輸入信息存在著各種各樣的編碼方式,幾乎所有的HTTP輸入都可以被表示成多種形式,使用編碼技術(shù)可以繞過(guò)Web應(yīng)用程序的驗(yàn)證與過(guò)濾機(jī)制,而且對(duì)這種攻擊難以防范。很多網(wǎng)絡(luò)應(yīng)用程序只在使用了客戶端機(jī)制來(lái)驗(yàn)證輸入。但是,客戶端的驗(yàn)證機(jī)制可以簡(jiǎn)單的繞過(guò)去,這就造成了網(wǎng)絡(luò)應(yīng)用程序直接面對(duì)那些惡意的輸入?yún)?shù)而毫無(wú)防備。攻擊者可以使用簡(jiǎn)單的工具例如telnet來(lái)生成他們的HTTP請(qǐng)求,他們可以很不在意那些開(kāi)發(fā)人員在客戶端預(yù)先設(shè)置好安全機(jī)制。
Ø 錯(cuò)誤的訪問(wèn)控制
錯(cuò)誤的訪問(wèn)控制(Broken Access Control),訪問(wèn)控制有時(shí)也被稱為授權(quán),是指一個(gè)網(wǎng)絡(luò)應(yīng)用程序如何將一些對(duì)于某些內(nèi)容和功能的訪問(wèn)權(quán)利賦予某些用戶而不是其它用戶。這種驗(yàn)證通常在授權(quán)之后執(zhí)行,并且管理那些己經(jīng)授權(quán)了的用戶允許進(jìn)行的什么操作。
第二章 進(jìn)行Web漏洞掃描的必要性
據(jù)Gartner統(tǒng)計(jì),近些年所發(fā)生的黑客攻擊等惡意網(wǎng)絡(luò)行為的75%以上為利用Web服務(wù)的漏洞的攻擊,而現(xiàn)有的諸多安全產(chǎn)品對(duì)其未能做到有效的防護(hù)。作為防火墻、IPS等安全產(chǎn)品的必要補(bǔ)充,Web應(yīng)用防火墻專門(mén)針對(duì)Web服務(wù)及相關(guān)應(yīng)用提供有效的防護(hù)