Web應(yīng)用安全之漏洞測試技術(shù)
原創(chuàng)【51CTO.com獨(dú)家翻譯】隨著人們對數(shù)據(jù)驅(qū)動的網(wǎng)站的依賴性的提高,針對WEb站點(diǎn)的攻擊的數(shù)量也呈現(xiàn)出上升的趨勢。作為開發(fā)人員,只有先弄明白了自己的站點(diǎn)是如何被攻擊的,才能設(shè)法保護(hù)它們。本文將揭示一些比較常見的攻擊,同時(shí)還介紹偵察這些攻擊的安全工具。
如今,Web在社交功能方面日益增長,但是它的安全性卻日益堪憂。事實(shí)上,據(jù)WASC在2009年初的估算,所有網(wǎng)站中有87%都存在安全隱患。雖然一些公司有能力外聘安全專業(yè)人員進(jìn)行滲透測試,但并非所有公司都有支付得起20,000到40,000美元的外包安全審計(jì)費(fèi)用。相反,公司可以自己設(shè)法讓開發(fā)人員獲悉這些安全威脅,充分引起他們的注意,從而在開發(fā)代碼時(shí)不會留下這樣的安全隱患。
常用縮寫詞
HTML:超文本標(biāo)記語言
SQL:結(jié)構(gòu)化查詢語言
URL:統(tǒng)一資源定位器
要想編寫出安全的代碼,您必須首先獲悉您的程序所面臨的威脅有哪些。本文考察了一些非常流行的漏洞,諸如跨站點(diǎn)腳本攻擊和SQL注射,同時(shí)還介紹了可以一些安全工具。這些工具不僅可以幫我們保護(hù)自己的網(wǎng)站,還能幫我們保護(hù)數(shù)據(jù)和網(wǎng)絡(luò)。本文無法替代安全專業(yè)人員,也不會教授艱深的安全技巧。相反地,我們主要介紹如何發(fā)現(xiàn)代碼中潛在的漏洞,以及如何修復(fù)它們。
常見安全漏洞
開始之前,我們需要對要查找的漏洞本身有所了解。我們先來看一下最流行的一個(gè)漏洞,即跨站點(diǎn)腳本攻擊(XSS)。XSS是網(wǎng)站被注入惡意腳本而導(dǎo)致的,舉例來說,Mallory編寫了一段腳本,它能夠?qū)⒂脩艮D(zhuǎn)至一個(gè)受信任的網(wǎng)站上,而該站點(diǎn)則是由Alice創(chuàng)建的。 Mallory把這個(gè)腳本插入一個(gè)流行的論壇上后,Bob在論壇中看到并點(diǎn)擊了這個(gè)鏈接,并在Alice的站點(diǎn)上創(chuàng)建了一個(gè)帳號。 這時(shí),這個(gè)腳本利用Alice的網(wǎng)站上的一個(gè)XSS漏洞將Bob的cookie發(fā)送給了Mallory,這樣一來,Mallory就可以冒充Bob并竊取其信息了。
SQL注入是第二大流行的安全漏洞,這主要是拜網(wǎng)站對數(shù)據(jù)庫的依賴性日益增強(qiáng)所賜。SQL注入實(shí)際上非常簡單:發(fā)現(xiàn)一個(gè)連接數(shù)據(jù)庫的網(wǎng)站后,心懷叵測的黑客可以執(zhí)行一個(gè)SQL查詢來實(shí)現(xiàn)開發(fā)人員始料未及的功能:繞過身份驗(yàn)證或者操縱數(shù)據(jù)。這種類型的攻擊,正是Albert Gonzalez竊取13000萬信用卡號的作案手法。在發(fā)動SQL注入攻擊過程中,Mallory發(fā)現(xiàn)了Alice用于銷售電子產(chǎn)品的網(wǎng)站。這次,Mallory并沒有像平常那樣輸入用戶名和密碼,而是在用戶名字段中輸入了‘) OR 1=1- 。雖然她它的輸入中包含了連字符(-),但是其它部分就無所謂了,因?yàn)?=1總是成立,所以她將成功登錄。現(xiàn)在,她可以操縱數(shù)據(jù)庫以竊取Bob的客戶信息。這個(gè)例子以最簡單的方式對SQL注入進(jìn)行了演示,您可以從中看到利用這種攻擊對于攻擊者而言是多么簡單。
如果沒有專業(yè)的安全人員團(tuán)隊(duì),普通的Web開發(fā)者看起來很難跟這些漏洞相抗衡。幸運(yùn)的是,事實(shí)并非如此。許多工具可以幫助我們查找網(wǎng)站中潛在的漏洞,如果據(jù)此采取必要的措施的話,我們就能夠有效的防御這些漏洞導(dǎo)致的攻擊。為了幫我們識別潛在危險(xiǎn),像WebScarab 和Paros 之類的工具能夠捕捉瀏覽器和服務(wù)器之間的會話,并能爬行網(wǎng)站。掌握這些信息后,您就可以檢測這些漏洞并采取防御措施了。
WebScarab
OWASP開發(fā)的WebScarab是分析瀏覽器請求和服務(wù)器應(yīng)答的首選代理。WebScarab除了提供數(shù)據(jù)包分析功能外,還可以對站點(diǎn)進(jìn)行Fuzz測試,以尋找上述的漏洞。 若要使用WebScarab,首先要配置web瀏覽器的代理設(shè)置。對于Mozilla Firefox瀏覽器來說,需要執(zhí)行下列步驟:
1. 單擊Tools > Options > Advanced > Network。
2. 單擊Settings。
這時(shí)Connection Settings窗口會打開。
3. 選擇Manual proxy configuration選項(xiàng)。
4. 在HTTP Proxy和SSL Proxy這兩個(gè)字段中,輸入localhost,并將端口設(shè)置為8008。
5. 確保No proxy for文本框?yàn)榭眨螕?OK按鈕。
圖 1展示了Firefox的連接設(shè)置。
圖 1. Firefox 的連接設(shè)置
#p#如上圖所示,選中Manual proxy configuration;HTTP Proxy為localhost,端口是8008。 SSL Proxy為localhost,端口是8008;選中SOCKS v5 。
對于Windows® Internet Explorer®來說,需要采取下列步驟:
1. 單擊Tools > Internet Options > Connections。
2. 單擊LAN Settings,Proxy Settings窗口將被打開。
3. 在Proxy Servers 之下,選擇Use a proxy server for your LAN復(fù)選框,然后單擊Advanced按鈕。
4. 對于HTTP和Secure字段,輸入localhost,并使用8008端口。
5. 應(yīng)確保Exceptions字段為空,然后單擊OK按鈕。
圖 2展示了Internet Explorer的代理設(shè)置。
圖 2. 設(shè)置代理
在上面的代理設(shè)置截圖中,HTTP被設(shè)置為localhost,使用8008端口。Secure被設(shè)置為localhost,端口為8008。
現(xiàn)在,我們已經(jīng)為掃描網(wǎng)站做好了準(zhǔn)備。
利用WebScarab掃描您的站點(diǎn)
下面的例子使用的站點(diǎn)為Hacme Casino,它是由Foundstone創(chuàng)建的,故意帶有某些漏洞以便用于培訓(xùn)。該站點(diǎn)是使用Apache Tomcat封裝的,所以如果您喜歡的話,也可以在本地運(yùn)行。
接下來,打開WebScarab。WebScarab啟動后,我們只會看到兩個(gè)選項(xiàng)卡:Summary和Intercept。因?yàn)槟胧褂肳ebScarab進(jìn)行fuzzing測試,所以要通過單擊Tools > Use full-featured interface > OK來切換視圖。這時(shí),WebScarab會提示我們重新啟動該軟件。重啟后,將看到如圖3所示的界面。(WebScarab提供了一個(gè)快捷鍵列表--令人遺憾的是,只有兩個(gè)快捷鍵。)
圖3. WebScarab界面
WebScarab界面的截屏,這里顯示了多個(gè)選項(xiàng)卡:Spider、Extensions 、XSS /CRLF 、SessionID Analysis 、Scripted 、Fragments 、Fuzzer 、Compare 、Search 、Summary 、Messages 、Proxy 、Manual Request 和Web Services。其中Summary選項(xiàng)卡被高亮顯示。
若要啟動新的會話,請單擊File > New。這時(shí)會出現(xiàn)一個(gè)方框,要求輸入會話保存地點(diǎn)。 選擇或者創(chuàng)建存儲目錄,然后單擊OK按鈕。當(dāng)您在Hacme Casino上使用WebScarab時(shí),需要在打開瀏覽器之前就啟動服務(wù)器。 然后,在瀏覽器的地址欄中輸入http://localhost:3000。
#p#一旦打開瀏覽器,您就會看到WebScarab中出現(xiàn)某些活動,因?yàn)閃ebScarab將捕獲瀏覽器和服務(wù)器之間的所有請求和響應(yīng)。因?yàn)槟胧褂胒uzzing功能來測試安全漏洞,所以要首先察看可能存在漏洞的地點(diǎn)。我們將登錄作為查找潛在漏洞的第一站。若要測試登錄過程,您應(yīng)當(dāng)記錄瀏覽器和服務(wù)器之間的交互信息。這里不需要成功進(jìn)行登錄,所以您可以隨意輸入用戶名和口令,對本例而言,我們輸入的用戶名和口令都為casino,然后單擊login按鈕。
當(dāng)然,登錄將失敗,但是我們對此并不關(guān)心。相反,我們要立馬返回到WebScarab。在Path欄中,右鍵單擊account\login,然后單擊Use as fuzz template,如圖4所示.
圖 4. Fuzzing測試模板
Fuzzing測試模板的截屏顯示了一個(gè)類似電子表格的視圖,其中含有各種各樣的web鏈接數(shù)據(jù)。
修改all_attack.txt文件
想該文件加入兩行內(nèi)容,即'or 'x'='x和 ') or 1=1-- ,這是兩行基本的SQL注入字符串,并且將在本例中用到。
執(zhí)行以下步驟:
1. 單擊WebScarab界面頂部的Fuzzer選項(xiàng)卡。
2. 單擊Source。
3. 導(dǎo)航至字典所在位置。(我使用的是all_attack.txt)
4. 提供來源描述,并單擊Add按鈕。
5. 單擊 Close返回Fuzzer窗口。
現(xiàn)在,轉(zhuǎn)到user_login參數(shù)并單擊Fuzz Source欄下面的相應(yīng)區(qū)域。因?yàn)槟鷥H僅裝入了一個(gè)(所有的攻擊)來源,所以在下拉框菜單選中它即可。對user_password參數(shù)進(jìn)行同樣的操作,如圖5所示。
圖 5. 選擇攻擊文件
攻擊文件的截屏顯示了一個(gè)包含各種可編輯參數(shù)的表格。
現(xiàn)在,您已經(jīng)定義了攻擊源,所以單擊Start就可以開始測試了。該fuzzer將從文件中取出參數(shù),并將其插入用戶名和口令輸入字段。每當(dāng)該工具完成一次嘗試,屏幕就會有相應(yīng)的輸出內(nèi)容。通常您將需要檢查結(jié)果中的每個(gè)ID,以便分析每次嘗試所發(fā)生的情況。然而,因?yàn)檫@里添加的字符串肯定奏效,所以您可以看到fuzzer成功時(shí)的情形。
雙擊本例中的第一個(gè)字符串,如圖6所示。
圖 6. 查找安全漏洞
#p#截屏顯示了一個(gè)頁面的解析信息。URL Encoded下面用橢圓括住的數(shù)據(jù)是用于user_login和user_password的變量。 Parsed下面用圓圈包圍的數(shù)據(jù)是用于地址和站點(diǎn)cookie的。
需要注意的是,上面圈起來的是用于user_login和user_password的變量值,即‘) OR 1=1--。接下來需要注意的是,地址已經(jīng)從http://localhost:3000(主頁)變?yōu)?A href="http://localhost:3000/lobby/games">http://localhost:3000/lobby/games,看上去用戶已經(jīng)成功登錄了。這又意味著什么呢? 它意味著你的站點(diǎn)是易受攻擊的。因?yàn)椤? OR 1=1--是一個(gè)SQL字符串,所以站點(diǎn)容易受到SQL注入的攻擊。使用Next按鈕滾動結(jié)果,并查找那個(gè)值。注意,這里的地址保持為http://localhost:3000。由此結(jié)果可知,插入這種類型的字符串不會導(dǎo)致成功的登錄嘗試,所以站點(diǎn)不易受這種類型的攻擊的影響。
Paros Proxy
進(jìn)行安全性測試的時(shí)候,另一個(gè)常用的工具是Paros Proxy。 就像WebScarab一樣,Paros也能捕獲瀏覽器和服務(wù)器之間的會話來用于分析。您還可以使用它來檢查站點(diǎn)中的安全漏洞。為了運(yùn)行Paros,您必須更改瀏覽器的代理設(shè)置所使用的端口號。對于WebScarab,您使用的端口號是8008;但是運(yùn)行Paros之前,需要將這個(gè)端口號改為8080,否則Paros就無法正常工作。對于本文來說,我們使用WebGoat——另一款來自O(shè)WASP的安全工具。就像Hacme Casino一樣,WebGoat使用Tomcat服務(wù)器作為本地主機(jī)。對于本文來說,使用Paros掃描WebGoat所找到的漏洞比Hacme Casino發(fā)現(xiàn)的安全漏洞要更多一些。
使用多個(gè)掃描器
凡是對自己站點(diǎn)進(jìn)行過測試的人可能都知道,同一個(gè)站點(diǎn),使用不同的掃描器會得到不同的掃描結(jié)果。這就是為什么專業(yè)滲透測試人員工作中會使用多種工具的原因。
更改端口之后,打開Paros,并執(zhí)行下列步驟:
1. 在WebGoat文件夾中,雙擊WebGoat.ba以啟動Tomcat。
2. 打開瀏覽器,然后在地址欄輸入http://localhost/WebGoat/attack。
3. 在用戶名和口令中輸入guest。
4. 單擊Start WebGoat。
現(xiàn)在,返回到Paros,并開始掃描WebGoat站點(diǎn)。當(dāng)然,您也可以通過在地址欄輸入相應(yīng)的地址來測試您自己的網(wǎng)站。
在Paros中,展開Sites文件夾,您就會在文件樹中看到http://localhost。繼續(xù)展開這個(gè)文件夾以調(diào)出WebGoat。高亮顯示W(wǎng)ebGoat,然后單擊Analyse Scan。這樣就會馬上開始掃描這個(gè)站點(diǎn)。對于大型站點(diǎn)來說,所需時(shí)間會較長,但是掃描這個(gè)站點(diǎn)僅需幾秒就夠了。一旦啟動掃描,底部窗格會自動變?yōu)锳lerts選項(xiàng)卡。如圖7所示。當(dāng)掃描完成時(shí),在通知您報(bào)告所在位置的彈出窗口中單擊OK按鈕。
圖 7. 查看警告信息
#p#警告屏幕展示了一個(gè)典型的IDE風(fēng)格的分割式窗口,在左上部的窗格中帶有一個(gè)站點(diǎn)樹,同時(shí)提供在右上方窗格中所選條目的詳細(xì)信息,另外,在底部窗格中還提供了一個(gè)警告樹。
為了更詳細(xì)地展示警告細(xì)節(jié),您可以展開它。您還可以查看報(bào)告提供的更多信息。然而,您應(yīng)當(dāng)首先保存掃描結(jié)果,方法是單擊File > Save As,選擇文件名和存放位置,最后單擊Save即可。
要想查看一個(gè)報(bào)告,單擊Report > Last Scan Report,在彈出窗口中單擊OK按鈕,這時(shí)一個(gè)新的瀏覽器選項(xiàng)卡會打開掃描結(jié)果,如圖8所示。這份報(bào)告為檢測到的每個(gè)安全漏洞都提供了相應(yīng)的信息,包括指向處理該特定攻擊的OWASP頁面鏈接。
圖 8. Paros的報(bào)告
這個(gè)Paros報(bào)告的截屏顯示了一個(gè)警告總表,并為每個(gè)警告提供了詳細(xì)信息。
測試中的誤報(bào)
雖然使用掃描器是查找網(wǎng)站潛在的安全漏洞的一個(gè)好方法,但是最優(yōu)秀的安全公司總是通過手工方式對這些潛在的安全漏洞進(jìn)行排查,之所以這樣做是為了防止誤報(bào)。這時(shí),需要對報(bào)告有潛在的漏洞利用的網(wǎng)站的各處進(jìn)行測試,即向站點(diǎn)本身插入SQL代碼或者腳本來觀察它的反應(yīng),然后使用各種攻擊程序?qū)φ军c(diǎn)進(jìn)行測試。大型公司經(jīng)常雇用精通此類測試的專業(yè)程序設(shè)計(jì)員,但是作為開發(fā)人員,您可以自己進(jìn)行一些這樣的測試。這不僅能夠提高當(dāng)前站點(diǎn)的安全性,而且對將來開發(fā)站點(diǎn)時(shí)也很有幫助。
與SQL注入有關(guān)的誤報(bào)
我們來看看使用Hacme Casino站點(diǎn)時(shí),WebScarab發(fā)現(xiàn)的安全漏洞:在登錄時(shí)出現(xiàn)SQL注入漏洞。運(yùn)行Hacme Casino,在站點(diǎn)的登錄輸入?yún)^(qū)輸入WebScarab得手的SQL代碼,即‘) OR 1=1--。當(dāng)您單擊Login時(shí),帳戶Andy_Aces被打開,因?yàn)?=1總為真,這是SQL注入最常見的手法。就Andy而論,他的運(yùn)氣真是不怎么樣,因?yàn)樗沁@個(gè)數(shù)據(jù)庫中的第一個(gè)帳戶。
它是如何得手的? 在后端,這個(gè)數(shù)據(jù)庫運(yùn)行了一個(gè)如下所示的查詢:
SELECT * FROM users WHERE (username=username AND password=password)
通過登錄框注入的代碼轉(zhuǎn)變?yōu)橛行У牟樵儯?/P>
SELECT * FROM users WHERE (username=’’) OR 1=1—AND password=’’)
這個(gè)查詢返回的結(jié)果是允許站點(diǎn)的第一個(gè)用戶成功的登錄,而不幸的是這個(gè)用戶恰恰就是Andy。
當(dāng)然,這個(gè)例子僅僅是針對SQL注入的,即使如此,如果某些人在攻擊網(wǎng)站方面非常老道,那么他或她實(shí)際上就能夠利用這個(gè)安全漏洞來創(chuàng)建用戶、修改口令甚至從網(wǎng)站上提取敏感數(shù)據(jù)。保護(hù)站點(diǎn)免受這些攻擊時(shí),還需采取以下步驟:
使用參數(shù)化查詢或者存儲過程而不是使用字符串拼接來訪問數(shù)據(jù)庫。參數(shù)化查詢要求您定義所有的SQL代碼,然后傳入每個(gè)參數(shù)來進(jìn)行查詢。這使得數(shù)據(jù)庫能夠區(qū)分代碼和數(shù)據(jù),所以用戶提供的輸入內(nèi)容的類型就不會引起問題。這一點(diǎn)上存儲過程類似于參數(shù)化查詢,它也要求您首先定義SQL代碼,然后傳入?yún)?shù)。區(qū)別是,用于存儲過程的SQL代碼是在數(shù)據(jù)庫本身內(nèi)定義和存放的,然后供應(yīng)用程序調(diào)用。
通過白名單方式對用戶輸入進(jìn)行消毒處理。如果要求使用名稱,那么只允許使用字母a-z和A-Z。對于電話號碼,只允許使用字符0-9。您可以利用你的數(shù)據(jù)庫支持的相應(yīng)驗(yàn)證技術(shù)來達(dá)此目的。
通過數(shù)據(jù)庫設(shè)置字符轉(zhuǎn)義方案,對用戶提供的輸入進(jìn)行轉(zhuǎn)義處理。對特殊字符進(jìn)行轉(zhuǎn)義就是告訴數(shù)據(jù)庫,查詢中的這些字符是數(shù)據(jù),而非代碼。如果對用戶提供的所有的輸入都進(jìn)行正確的轉(zhuǎn)義處理的話,就不會受到帶有SQL代碼的用戶輸入的威脅了。
不要給攻擊者任何幫助。應(yīng)確保錯(cuò)誤信息不會提供可以用來攻擊站點(diǎn)的任何有用信息。
與XSS有關(guān)的誤報(bào)
為了演示XSS攻擊,我們重新回到WebGoat。單擊Cross Site Scripting > LAB: Cross Site Scripting > Stage 1: Stored XSS啟動我們的站點(diǎn)。登陸到演示站點(diǎn)Goat Hills Financial,這里使用的用戶名為Larry Stooge,口令為Larry。現(xiàn)在,攻擊者將需要查找可以輸入惡意腳本的地方。Search Staff功能具有一個(gè)文本框,人們可以在此輸入一個(gè)名稱,單擊Search后來顯示有關(guān)結(jié)果,如圖9所示.
圖9. XSS入口點(diǎn)
Goat Hills Financial Human Resources處的XSS入口點(diǎn)的截屏,它為我們顯示了一個(gè)文本字段,我們可以在此輸入用戶名稱并通過FindProfile按鈕來查找用戶。
在Name框中,輸入alert("You got me with XSS");。 這個(gè)腳本只是一個(gè)警告框,如圖10所示,但是您可以設(shè)想如果這個(gè)腳本將用戶重定向到一個(gè)偽造的、要求訪問者輸入其社會保險(xiǎn)號、家庭地址、銀行信息等的虛假人力資源站點(diǎn)時(shí)后果會有多么嚴(yán)重。實(shí)際上,只要修改與OK按鈕有關(guān)的動作就能做到這一點(diǎn)。對于真正有創(chuàng)造性的惡意黑客來說,只要用戶信任他們,那么就基本上沒有什么做不到的。
圖 10. 一次成功的xss攻擊
上面是一個(gè)帶有警示信息的警告框。
為了防止xss攻擊,需要對所有的用戶輸入進(jìn)行嚴(yán)格的過濾處理。如果輸入隨后被用作操作系統(tǒng)命令、腳本和數(shù)據(jù)庫查詢的參數(shù),那么更要嚴(yán)格檢查。為了對用戶輸入進(jìn)行清洗,可以在將其插入HTML元素和HTML普通屬性之前,對不可信的數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理。OWASP建議對所有ASCII值小于256的字符都進(jìn)行換碼。JavaScript 數(shù)據(jù)值、HTML風(fēng)格的屬性值和HTML值屬性也可進(jìn)行轉(zhuǎn)義。當(dāng)然,對輸入數(shù)據(jù)進(jìn)行轉(zhuǎn)義之前,請確保已經(jīng)對網(wǎng)站的所有輸入進(jìn)行了驗(yàn)證。如果所需期望的是特定的輸入值、數(shù)字、字母、電子郵件地址等等,那么就只允許這種類型的數(shù)據(jù)并且拒絕任何其他類型的數(shù)據(jù)。
結(jié)束語
本文中,我們考察了許多針對網(wǎng)站的常見攻擊,重要的是,通過閱讀本文您會對這些攻擊的工作原理有一個(gè)深入的理解。如果知道了攻擊者正尋找哪些安全漏洞,以及這些漏洞的預(yù)防措施,那么您就能防止攻擊者攻陷網(wǎng)站。通過掌握在本文中介紹的攻擊與防御原理,能夠?yàn)閷順?gòu)建安全Web站點(diǎn)和應(yīng)用打下一個(gè)良好的基礎(chǔ)。
【編輯推薦】