1.介紹
Ajax由於其良好的交互性,在去年很引人注目。Google Suggest 和 Google Maps [ref 1]就是一些Ajax早期的著名應用。現在,企業正在考慮他們如何也能利用AJax,web開發者在學習它,安全專家在想如何使它變得安全,黑客們在思考如何入侵。所有能提高服務器吞吐量,能產生更多的動態頁面傳輸,而且能為最終用戶提供更加豐富的web應用的技術都必然在這個領域出現。
Ajax的下一步計劃稱為”Web 2.0”。這篇文章的目的是介紹一些關於現代Ajax web技術的安全建議。盡管Ajax的應用難於測試,安全專家已經擁有大多數所需要的有關方法和工具。作者將討論如今的趨勢是否需要告別完全的網絡更新,使用Ajax也意味著我們將面臨一些新的安全問題。我們將從Ajax技術簡要介紹開始,接著討論使用AJax技術應用帶來的安全沖擊。
2.初識AJax
正常的web應用程序在同步模式下工作,一個web請求之後,一個響應在表示層引起一些動作。例如,點擊鏈接或者提交按鈕向web服務器產生一個帶有相應參數的請求。傳統的” click and wait”方式限制了應用程序的交互性。AJax(Asychronous Javascript and XML)技術的使用緩解了這個問題。文中,我們將AJax定義為向web服務器產生異步調用而不引起網頁完全更新的方法。這種交互性的通過三種不同的組件實現:客戶端腳本語言,XmlHttpRequest (XHR)對象和XML。
讓我簡短地分別介紹一下這些組件。在請求響應中,客戶端腳本語言被用來初始化服務器調用和程序的存取,以及更新客戶浏覽器的DOM。客戶端普遍使用Javascript,由於它被知名浏覽器普遍的采用。第二個組件是XHR對象,它是最重要的部分。JavaScript這類語言使用XHR對象在場景後面向web服務器發送請求,使用HTTP作為傳輸中介。接著是第三個組件,它的使用是必要的:XML是被交換信息的數據格式。
很多站點使用JSON(Javascript Object Notation)代替XML,因為其更加容易解析不需要那麼多管理的費用。使用JavaScript解析JSON,只需要簡單的把它傳給eval()函數。另一方面,有人可能使用XPath解析返回的XML。同樣的,外面還有很多”AJax 站點”既不使用XML,也不使用JSON,而是僅僅發送無格式的動態插入到網頁的舊Html碎片。
因此,Ajax不是一個新的技術商標,而是現存技術的聯合應用,推動了web應用程序高度交互性的發展。實際上,所有這些組件已經出現好些年了,隨Internet Explorer 5.0的發布而顯著起來。開發者創建了AJax許多的應用,諸如”提示”文本框(象Google Suggest)和自動更新數據列表。所有的XHR請求仍然是由典型的服務器端框架執行,例如標准的選擇象J2EE,.Net和PHP。下面的Figure 1. 是AJax應用程序的異步特性圖例:
3. AJax安全應用
現在我們已經回顧了Ajax的基礎,讓我們討論一下它的安全含義。在web應用領域,Ajax本身並沒有引入新的安全弱點。這些應用程序面臨和經典web應用程序同樣的問題。不幸的是,Ajax共通的最佳實現還沒有發展起來,這就留下了很多的犯錯誤的余地。其包括安全驗證,授權,存取控制和輸入檢查。[ref 2]。涉及AJax使用的一些潛在領域包括:
·客戶端安全控制
有人認為,客戶端程序的依賴性可能引出來一些已經眾所周知的問題。[ref 2]。一種可能性是開發者通過客戶端控制破壞安全。如前所述,AJax的使用需要相當多的腳本語言。如今,web開發者同時寫服務器端和客戶端的代碼,這也許會吸引面向客戶端安全控制執行的開發者。這種方式是非常不可靠的,因為攻擊者在測試應用程序弱點時,可以修改運行在他們客戶端電腦上的任何代碼。安全控制應該完全在服務器上執行或者經常在服務器上升級。
·不斷增加的攻擊面
第二個挑戰是保護不斷增加的攻擊面。Ajax不可避免的增加了系統的整體復雜性。在采用AJax的過程中,開發者也許要編寫大量的服務器端頁面,每一個頁面執行一些整個程序中的小功能(象為了自動完成一個用戶的城市和州域,查尋郵政區號)。這些小頁面將各自成為黑客的一個附加攻擊目標,而為了保證不引入新的安全弱點一個附加的點需要保護起來。這個可以比喻成著名的多重點的安全觀點好像進入一個房子:保護只有一扇門的房子難度和保護有十扇門的房子相比。
·連接用戶和服務器之間的間隙
Ajax是開發者通過其縮短最終用戶和由面向服務構架接口的距離的一種方法。[ref 3]增加寬松聯系的基於服務的構架在企業環境中有許多優點,是一種很有希望的方法。隨著更多的基於服務端點的發展,隨著AJax引入向最終用戶提供更多的靈活的處理的可能,遠離三層標准模型的可能性增加了。
一般來說,企業內部的許多web服務(與Internet上的全部服務相對)被設計成B2B,因此,設計者和開發者常常沒有考慮實際用戶的交互性。這個缺乏遠見的做法導致了一些壞的設計過程中安全假設。例如,最初的設計者可能假設安全認證,授權和輸入檢查將由其它中層系統執行。一旦有人允許”外部人士”通過AJax的使用直接調用這些服務,就引入了一個考慮之外的代理。這類使用的一個實際例子是Microsoft的Atlas[ref 4]和web服務同時使用的一致性程度檢查。開發者現在可以編寫JavaScript來生成XML輸入以及從客戶端浏覽器中正確調用web服務。在過去這個由代理和服務器完成。
·跨站腳本(XSS)的新希望
另外一個不幸的事實是攻擊者通過利用跨站腳本(XSS)的弱點,能夠更有創造性(換句話說,更危險)。[ref 5]黑客過去一般在”單線程”環境下使用XSS漏洞,攻擊執行的時候用戶的浏覽器處於等待狀態。這個等待狀態提供了一個可能錯誤執行程序用戶的線索。通過Ajax的引入,一個攻擊者可以以更加隱秘的方式利用跨站腳本弱點。當你用一個允許AJax的程序檢查你的郵件的時候,惡意代碼可能給你所有的朋友發送Email而你的浏覽器不會留下任何可見的痕跡。
為了解決這方面的問題,在把程序放到產品中之前,必須執行足夠多的有針對性的安全測試。即使AJax程序是web應用程序,由於這些應用程序高度交互性的特點,一個組織好的現存的安全測試方法可能是不夠的。
4.AJax如何
測試一個正常web應用程序的時候,一個入侵測試者從footprint應用程序開始。Footprint階段的目的是捕獲請求和響應,這樣測試者就知道應用程序如何和服務器通信以及它所接收到的響應。這個信息通過本地代理諸如Burp[ref 6]或者Paros[ref 7]記入日志。footprint階段,必須盡可能做到全面,因此測試者日志向應用程序使用的所有頁面發出請求。
之後,測試者將開始系統的錯誤注入過程,手動或者使用自動工具來測試從web服務器上傳入傳出的參數。
·“狀態”問題
在一般的web應用程序世界裡,應用程序的狀態被明確的定義。存在於一個頁面的DOM中的每一個事物都可以被認為是頁面的當前狀態。如果狀態需要改變,一個請求就被發送到服務器,而響應詳細說明了狀態如何改變。
·通過定時器事件初始化請求
這涉及到通過基於定時器的事件而不需要任何用戶交互的更新用戶界面。應用程序可能定時的發送請求到服務器來更新web頁面上的信息。例如,一個金融應用程序可能使用XHR對象更新顯示當前股票市場信息的網頁部分內容。測試者可能不會注意到後台的進程,如果他們沒有在正確的時間捕獲到請求,因為這裡可能沒有可見的鏈接或者按鈕來提醒測試者後台有請求產生了。
·動態DOM更新
AJax響應可以包含JaveScript片斷,它能被web應用程序評價而且可以在用戶接口中出現。這可能包括新的鏈接,服務器上新的文檔的存儲,等等。實現這個的一種方式是通過使用eval()聲明。[ref 2,ref 8]eval()聲明接受一個單變量,一個字符串,而且執行這個字符串,就像它是程序的一部分一樣。
Google Suggest是一個很好的例子,其中應用程序接收到一個Javascript片斷,這個片斷得到評價而且作為完成輸入詢問的可能建議。這個行為對於手動測試者和使用自動工具的測試者都有問題的。兩者將不得不了解JavaScript在web應用程序的上下文中是如何使用的。當一個輸入參數在客戶端計算後被送回來的時候就需要格外小心。這個聽起來象典型的XSS而且它就是,但是它已經變得非常容易被利用。使用黑名單確認的應用程序更加容易受到影響,因為攻擊者不需要注入許多標記。一些方法可以被用來使用XSS而不需象過去那樣的腳本標簽。
·XML Fuzzing
AJax能被用來以XML的格式發送請求接收響應。簡單的自動工具確實理解GET和POST方法但是可能不知道如何處理使用XML格式封裝的信息。
測試者必須保證開發者沒有偏離一個安全的構架。在一個安全系統中,安全控制在一個最終用戶控制之外的環境中實行。執行reviews的時候,你必須徹底審查客戶端代碼以確定是否能在提交變量(cookIEs, FORM參數, GET參數)給服務器之前修改它們的狀態。一旦發生了這個,就需要分析JavaScript來確定原因。
就如一般的web應用程序一樣,所有的AJax請求需要為授權問題進行測試。開發者相信因為頁面在一個客戶端腳本引擎後面調用就不需要授權,那他就可能成為受害者。實際上並非如此。
5.結論
Ajax應用程序通過它高度交互性的特性提供了新的可能性。開發者可能對這些性能引入的新的不安全因素感到厭倦。安全測試者必須增加他們的測試方法和工具集來應付AJax應用程序。
這篇文章中,作者介紹了一些Ajax技術中的安全應用。入侵測試者正看到他們已經擁有知識和工具來評價Ajax應用程序,但是它們還是有點難於測試。後面的文章將關注這個問題的更多方面,象可以在AJax安全測試中使用的有幫助的工具。
6.參考
[ref 1] Google Suggest and Google Maps, two early AJax applications.
[ref 2] Stewart Twynham, "AJax Security", Feb. 16th, 2006.
[ref 3] Andrew van der Stock, "AJax Security", OWASP Presentation given on February 7, 2006. A direct descendent of this presentation is also available from Andrew van der Stock at http://www.greebo.Net/owASP/AJax_security.pdf.
[ref 4] Microsoft's Altas framework tries to integrate as a middle-tIEr.
[ref 5] Post by "Samy," on a "Technical explanation of the MySpace worm".
[ref 6] Burp web application proxy for penetration testing.
[ref 7] Paros web application proxy for penetration testing.
[ref 8] post by Rogan Dawes, author of WebScarab, on the WebAPPSec mailing list.
7.進一步的閱讀材料
·Jesse James Garrett, "AJax: A New Approach to Web Applications", Feb. 18, 2005.
·Ryan Asleson and NathanIEl T. Schutta, "Foundations of AJax", APress Publications, Oct 2005.
·Nicholas C. Zakas, Jeremy McPeakandJoe Fawcett, "Wrox Professional AJax", Feb 2006.
·Eric Pascarello, "Eric Pascarello dissects AJax security vulnerabilitIEs", Feb. 07, 2006.
·Andrew van der Stock, "AJax and Other 'Rich' Interface TechnologIEs".
8. 關於作者
Jaswinder S. Hayre, CISSP, 和Jayasankar Kelath, CISSP,都是紐約Ernst & Young's Advanced Security Center的高級安全工程師。
(t116)
================================