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