利用Firefox審計(jì)Web2.0應(yīng)用程序安全
原創(chuàng)【51CTO.com獨(dú)家特稿】我們知道,與傳統(tǒng)的Web應(yīng)用程序不同,Web 2.0應(yīng)用程序一般都是建立在Ajax和交互式的Web服務(wù)之上的,這種技術(shù)轉(zhuǎn)變給安全專業(yè)人員帶來了新的安全挑戰(zhàn)。
一、簡介
本文為安全專業(yè)人員詳細(xì)介紹了利用Firefox及其插件來剖析Web2.0應(yīng)用程序的一些方法、工具和技巧。通過閱讀本文,您可以了解:
◆Web 2.0 應(yīng)用程序體系結(jié)構(gòu)及其安全事項(xiàng)。
◆黑客所面臨的挑戰(zhàn),如發(fā)現(xiàn)隱藏的調(diào)用、爬行問題以及Ajax邏輯的發(fā)現(xiàn)等。
◆利用Firebug工具尋找XHR調(diào)用。
◆利用Chickenfoot插件自動(dòng)模擬瀏覽器事件。
◆利用Firebug調(diào)試器從安全角度對(duì)應(yīng)用程序進(jìn)行調(diào)試。
◆安全漏洞的系統(tǒng)性檢測(cè)方法。
二、Web 2.0 應(yīng)用程序概述
近來流行的Web 2.0指的是采用了SOAP、XML-RPC和REST等XML驅(qū)動(dòng)的新一代的Web應(yīng)用程序。通過使用Ajax和富 Internet 應(yīng)用程序(Flash)組件,這些新型的Web應(yīng)用程序能夠?yàn)榻K端用戶提供更強(qiáng)大和靈活的用戶界面。
這種技術(shù)的更替對(duì)Web應(yīng)用程序的總體結(jié)構(gòu)以及客戶和服務(wù)器之間通信機(jī)制產(chǎn)生了很大的影響,同時(shí)也帶來了許多新的安全挑戰(zhàn)。比如,一些新型的蠕蟲就是利用客戶端AJAX框架來竊取機(jī)密信息的。
![]() |
圖1 Web 2.0的體系結(jié)構(gòu)示意圖 |
如圖 1 所示,在左邊的瀏覽器進(jìn)程可以分成下列層次:
◆表示層——HTML/CSS提供了應(yīng)用程序在瀏覽器窗口中的總體外觀。
◆邏輯處理層——運(yùn)行在瀏覽器中的JavaScript使得應(yīng)用程序可以執(zhí)行業(yè)務(wù)邏輯和通信邏輯。AJAX驅(qū)動(dòng)的組件位于最底層。
◆傳輸層——XMLHttpRequest(XHR)。這個(gè)對(duì)象使得客戶和服務(wù)器之間可以通過HTTP(S)進(jìn)行異步通信并交換XML。
如圖 1所示,右邊的服務(wù)器端組件通常位于防火墻之后的企業(yè)基本設(shè)施之中,這些組件包括已部署的Web服務(wù)以及傳統(tǒng)的Web應(yīng)用程序資源。運(yùn)行在瀏覽器上的Ajax資源可以直接跟基于XML的Web 服務(wù)進(jìn)行通信,并且無需刷新頁面就能與其交換信息。所有這些通信,對(duì)最終用戶來說都是透明的,換言之最終用戶不會(huì)感覺到發(fā)生了任何重定向。實(shí)際上,“刷新”和“重定向”是第一代Web應(yīng)用程序邏輯不可分割的一部分。在Web 2.0框架中,通過Ajax極大地減少了對(duì)于刷新和重定向的使用。#p#
三、Web 2.0安全審計(jì)所面臨的挑戰(zhàn)
在這種異步的框架中,應(yīng)用程序沒有太多的“刷新”和“重定向”。其結(jié)果是,許多可以被攻擊者利用的服務(wù)器端資源都隱藏起來了。安全專業(yè)人員在了解Web2.0應(yīng)用程序時(shí),需要注意下列三個(gè)重要方面:
1. 發(fā)現(xiàn)隱藏的調(diào)用——這里要強(qiáng)調(diào)的是瀏覽器中已加載的頁面生成的XHR驅(qū)動(dòng)的調(diào)用。它們使用JavaScript通過HTTP(S)對(duì)后端服務(wù)器進(jìn)行調(diào)用。
2. 爬行問題——傳統(tǒng)的網(wǎng)絡(luò)爬蟲應(yīng)用程序會(huì)在兩個(gè)方面遇到問題,一是重復(fù)瀏覽器的動(dòng)作方面,二是在此過程中識(shí)別服務(wù)器端關(guān)鍵資源方面。如果資源是通過JavaScript利用一個(gè)XHR對(duì)象進(jìn)行訪問的,那么網(wǎng)絡(luò)爬蟲很可能根本就爬不到它。
3. 邏輯發(fā)現(xiàn)——現(xiàn)在,Web應(yīng)用程序是通過JavaScript進(jìn)行加載的,所以邏輯和一個(gè)特定的事件是密不可分的。每個(gè)HTML頁面都可能從服務(wù)器裝載三個(gè)或者四個(gè)JavaScript資源。 這些文件中的每一個(gè)都有許多函數(shù),但是一個(gè)事件可能僅僅用到了其中的很小一部分來執(zhí)行其邏輯。
在審計(jì)Web應(yīng)用程序時(shí),我們需要探索并找到克服這些障礙的方法。對(duì)于本文來說,我們將使用Firefox作為我們的瀏覽器,并設(shè)法利用它的插件來應(yīng)對(duì)上述挑戰(zhàn)。
四、發(fā)現(xiàn)隱藏的調(diào)用
Web2.0應(yīng)用程序可以從服務(wù)器裝載單個(gè)頁面,也可在構(gòu)建最終頁面時(shí)又多次調(diào)用XHR對(duì)象。這些調(diào)用可以從服務(wù)器那里異步請(qǐng)求內(nèi)容或者JavaScript代碼。在這種情況下,我們面臨的挑戰(zhàn)就是確定所有的XHR調(diào)用和從服務(wù)器獲取的資源。這些信息對(duì)于發(fā)現(xiàn)所有可能的資源和相應(yīng)的安全漏洞很有幫助。下面通過一個(gè)簡單的示例進(jìn)行說明。
假設(shè)我們可以訪問一個(gè)簡單的新聞門戶站點(diǎn)來獲得當(dāng)天的商業(yè)新聞,該站點(diǎn)位于:
瀏覽器中的頁面截圖將類似于圖2所示:
![]() |
圖2 一個(gè)簡單新聞門戶頁面 |
對(duì)于Web 2.0 應(yīng)用程序,它們是使用XHR對(duì)象對(duì)服務(wù)器進(jìn)行Ajax調(diào)用。我們可以利用一個(gè)工具來找出這些調(diào)用,這個(gè)工具就是著名的Firebug——它是Firefox瀏覽器的一個(gè)插件,可以用來發(fā)現(xiàn)XHR對(duì)象調(diào)用。
在利用此插件瀏覽一個(gè)頁面之前,要確保選中了攔截XHR調(diào)用的選項(xiàng),具體如下圖所示:
![]() |
圖3 設(shè)置Firebug使其攔截XMLHttpRequest調(diào)用 |
啟用攔截XMLHttpRequest調(diào)用的選項(xiàng)后,我們就可以瀏覽前面的頁面了,這時(shí)就能發(fā)現(xiàn)該頁面發(fā)給服務(wù)器的所有XHR對(duì)象調(diào)用了,具體如圖4所示。
![]() |
圖 4 捕獲Ajax調(diào)用 |
上面我們可以清楚地看到瀏覽器利用XHR發(fā)送的多個(gè)請(qǐng)求。它從服務(wù)器加載了AJAX 框架Dojo,并調(diào)用了在服務(wù)器上的一個(gè)資源來取得新聞文章。
http://example.com/ getnews.aspx?date=09262006
如果我們仔細(xì)觀察此代碼的話,我們就會(huì)在JavaScript代碼中發(fā)現(xiàn)以下函數(shù):
function getNews() { getnews.aspx?date=09262006", true); http.onreadystatechange = function() { if (http.readyState == 4) { var response = http.responseText; document.getElementById('result').innerHTML = response; } } http.send(null); } |
上面的代碼對(duì)后端Web服務(wù)器進(jìn)行了一個(gè)異步調(diào)用,并請(qǐng)求資源 getnews.aspx?Date=09262006。這個(gè)頁面的內(nèi)容被放置在生產(chǎn)的HTML頁面中標(biāo)識(shí)符為“result”的位置上。這明顯是利用XHR對(duì)象進(jìn)行的Ajax調(diào)用。
通過這種形式的分析,我們能找出有弱點(diǎn)的內(nèi)部URL、查詢和POST請(qǐng)求。比如,對(duì)于上面的例子,參數(shù)“date”就容易受到SQL注入攻擊。 #p#
五、爬行問題和瀏覽器模擬問題
當(dāng)進(jìn)行Web應(yīng)用程序?qū)徲?jì)的時(shí)候,經(jīng)常要用到一個(gè)重要偵察工具,即web爬蟲。web爬蟲抓取所有頁面并收集所有的HREF(鏈接)。但是如果這些HREF指向一個(gè)利用XHR對(duì)象進(jìn)行Ajax調(diào)用的JavaScript函數(shù)的話,情況會(huì)怎樣?很糟糕,Web爬蟲可能遺漏這些信息。
在許多情形下,模擬這個(gè)環(huán)境將變得非常困難。比如,下面是一組簡單的鏈接:
go1 go2 go3 |
單擊鏈接go1的時(shí)候,就會(huì)執(zhí)行g(shù)etMe()函數(shù),這個(gè)函數(shù)的代碼如下所示。 需要注意的是,這個(gè)函數(shù)也可以放在一個(gè)單獨(dú)的文件中。
function getMe() { var http; http = new XMLHttpRequest(); http.open("GET", "hi.html", true); http.onreadystatechange = function() { if (http.readyState == 4) { var response = http.responseText; document.getElementById('result').innerHTML = response; } } http.send(null); } |
上述代碼對(duì)在服務(wù)器上的資源hi.html進(jìn)行了一個(gè)簡單的Ajax調(diào)用。
那么,我們能夠自動(dòng)模擬這個(gè)單擊嗎?答案是肯定的。一個(gè)方法就是使用Firefox插件Chickenfoot,這個(gè)插件提供了基于JavaScript的應(yīng)用程序接口,從而為瀏覽器提供了一個(gè)可編程接口。
通過此Chickenfoot插件,您可以編寫簡單的JavaScript代碼來自動(dòng)發(fā)出瀏覽器動(dòng)作。使用該方法,就可以輕松完成爬行web頁面之類的簡單任務(wù)的自動(dòng)化。舉例來說,以下簡單腳本將利用onclick事件來“單擊”所有的錨。與傳統(tǒng)的web爬蟲相比,這個(gè)插件的優(yōu)點(diǎn)是所有這些onclick事件都是由后端基于XHR的Ajax調(diào)用發(fā)出的;而這些Ajax調(diào)用是會(huì)被網(wǎng)絡(luò)爬蟲所遺漏的,因?yàn)榫W(wǎng)絡(luò)爬蟲會(huì)試圖解析JavaScript并且收集可能的鏈接,卻無法替換實(shí)際的onclick事件。
l=find('link') for(i=0;i |
您可以將這個(gè)腳本裝載到Chickenfoot控制臺(tái)中,并運(yùn)行它,如圖5所示。
![]() |
圖5 利用Chickenfoot模擬Ajax調(diào)用onClick |
這樣,我們就可以創(chuàng)建JavaScript并從Firefox瀏覽器內(nèi)部來審計(jì)基于AJAX的應(yīng)用程序的安全性了。對(duì)于Chickenfoot插件,還有其它幾個(gè)API調(diào)用,其中一個(gè)比較有用的就是構(gòu)建爬蟲例程的fetch命令。#p#
六、邏輯發(fā)現(xiàn)與應(yīng)用程序解析
為了剖析客戶端基于AJAX的應(yīng)用程序,需要仔細(xì)遍歷每一事件以確定其處理邏輯。確定整個(gè)邏輯的一種方法就是逐行閱讀所有代碼。但是通常每個(gè)事件調(diào)用僅涉及文件中的少數(shù)幾個(gè)函數(shù)。因此,我們需要一種技術(shù)來步入調(diào)試運(yùn)行在瀏覽器中的有關(guān)代碼。
這時(shí),有些強(qiáng)大的JavaScript調(diào)試器可以達(dá)到這一目的,F(xiàn)irebug便是其中之一。另一個(gè)調(diào)試器是venkman。在下面的例子中,我們將使用Firebug。
這里給出一個(gè)處理登錄過程的簡單的示例:login.html頁面將從最終用戶那里接收用戶名和口令,如圖6所示。使用Firebug的檢查功能可以確定此表單的屬性。
![]() |
圖6 借助 Firebug審查表單屬性 |
檢查表單屬性之后,就會(huì)看到一個(gè)對(duì)auth函數(shù)的調(diào)用。我們現(xiàn)在可以通過Firebug的調(diào)試器功能把內(nèi)部邏輯跟特定的事件隔離開來了,如圖7所示。
![]() |
圖7 使用Firebug進(jìn)行調(diào)試 |
這個(gè)頁面的所有JavaScript依賴項(xiàng)都可以查看到。然后,調(diào)用ajaxlib.js和validation.js腳本。這兩個(gè)腳本可能具有若干函數(shù),我們可以通過登錄過程用到的一些函數(shù)來進(jìn)行推測(cè)。 我們可以使用斷點(diǎn)來步入調(diào)試整個(gè)應(yīng)用程序。設(shè)置一個(gè)斷點(diǎn)后,我們可以輸入證書信息,單擊“Submit”按鈕,并控制執(zhí)行過程。在我們的例子中,在函數(shù)auth內(nèi)設(shè)置了一個(gè)斷點(diǎn),如圖8所示。
![]() |
圖8 利用斷點(diǎn)控制執(zhí)行過程 |
現(xiàn)在,我們就可以通過單擊“step in”按鈕來進(jìn)行步入調(diào)試了,如圖8所示。JavaScript的控制權(quán)轉(zhuǎn)移至另一個(gè)位于validation.js文件中的函數(shù)userval,如圖9所示。
![]() |
圖9 移動(dòng)到 vali頁面dation.js腳本 |
上圖顯示了用于驗(yàn)證用戶名字段的正則表達(dá)式模式。一旦完成此驗(yàn)證任務(wù),控制權(quán)會(huì)傳遞給另一個(gè)函數(shù)callGetMethod,如圖10所示。
![]() |
圖10 進(jìn)行Ajax調(diào)用 |
最后,運(yùn)行序列結(jié)束時(shí),我們能監(jiān)視到XHR對(duì)象對(duì)后端Web服務(wù)的調(diào)用,如圖11所示。
![]() |
圖11 Firebug控制臺(tái)中的Web服務(wù)調(diào)用 |
這樣我們就確定出用于此后端Web服務(wù)的資源位置,如下所示:
http://example.com/2/auth/ws/login.asmx/getSecurityToken?username=amish&password=amish
很明顯,上面的資源是一些運(yùn)行在.NET framework之下的Web服務(wù)。經(jīng)過上面一番剖析之后,我們發(fā)現(xiàn)了一個(gè)可以輕松地繞過的用戶驗(yàn)證例程。對(duì)于此Web應(yīng)用程序來說,這是一個(gè)潛在的安全威脅。
經(jīng)過以上測(cè)試可以發(fā)現(xiàn),利用一個(gè)WSDL文件并對(duì)此服務(wù)進(jìn)行蠻力攻擊就可以訪問該web服務(wù)及其終端。此外,我們還可以利用wsChess之類的工具來發(fā)動(dòng)各種形式的注射式攻擊(SQL或者XPATH注射)。
對(duì)本例而言,此應(yīng)用程序容易受到XPath注射的攻擊,不過針對(duì)這種攻擊的討論超出了本文的范圍。以上可以看出,這種逐步的方法有助于識(shí)別一些客戶端攻擊,例如XSS、DOM操縱攻擊、客戶端安全措施旁路、執(zhí)行惡意Ajax代碼,等等。
七、結(jié)束語
面向服務(wù)的體系結(jié)構(gòu)(SOA)、Ajax、富 Internet 應(yīng)用程序(RIA)和Web 服務(wù)已經(jīng)成為了新一代Web應(yīng)用程序的關(guān)鍵部件。為了跟上這些技術(shù)的步伐并應(yīng)對(duì)下一代應(yīng)用程序安全性挑戰(zhàn),我們需要設(shè)計(jì)和開發(fā)不同的方法和工具。審計(jì)應(yīng)用程序的有效方法之一就是有效地利用瀏覽器。
在本文中,我們介紹了三種針對(duì)Web2.0應(yīng)用程序的審計(jì)方法,通過這些方法,我們可以尋找并隔離一些有關(guān)Ajax的安全漏洞。瀏覽器自動(dòng)腳本不僅可以加速我們的分析過程,而且還能幫助我們發(fā)現(xiàn)有弱點(diǎn)的服務(wù)器端資源。
下一代應(yīng)用程序廣泛使用了JavaScript。得心應(yīng)手的調(diào)試工具是我們的穿著明亮盔甲的騎士。當(dāng)您打算使用Firefox對(duì)Web 2.0進(jìn)行安全審計(jì)時(shí),本文中介紹的技術(shù)將是一個(gè)不錯(cuò)的起點(diǎn)。
【51CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者!】