1.介紹
Ajax由于其良好的交互性,在去年非常引人注目。Google Suggest 和 Google Maps [ref 1]就是一些Ajax早期的著名應(yīng)用。目前,企業(yè)正在考慮他們?cè)趺匆材芾肁jax,web研發(fā)者在學(xué)習(xí)他,安全專家在想怎么使他變得安全,黑客們?cè)谒伎荚趺慈肭。所有能提高服?wù)器吞吐量,能產(chǎn)生更多的動(dòng)態(tài)頁(yè)面?zhèn)鬏敚夷転樽罱K用戶提供更加豐富的web應(yīng)用的技術(shù)都必然在這個(gè)領(lǐng)域出現(xiàn)。
Ajax的下一步計(jì)劃稱為”Web 2.0”。這篇文章的目的是介紹一些關(guān)于現(xiàn)代Ajax web技術(shù)的安全建議。盡管Ajax的應(yīng)用難于測(cè)試,安全專家已擁有大多數(shù)所需要的有關(guān)方法和工具。作者將討論如今的趨勢(shì)是否需要告別完全的網(wǎng)絡(luò)更新,使用Ajax也意味著我們將面臨一些新的安全問(wèn)題。我們將從Ajax技術(shù)簡(jiǎn)要介紹開(kāi)始,接著討論使用Ajax技術(shù)應(yīng)用帶來(lái)的安全沖擊。
2.初識(shí)Ajax
正常的web應(yīng)用程式在同步模式下工作,一個(gè)web請(qǐng)求之后,一個(gè)響應(yīng)在表示層引起一些動(dòng)作。例如,點(diǎn)擊鏈接或提交按鈕向web服務(wù)器產(chǎn)生一個(gè)帶有相應(yīng)參數(shù)的請(qǐng)求。傳統(tǒng)的” click and wait”方式限制了應(yīng)用程式的交互性。Ajax(Asychronous Javascript and XML)技術(shù)的使用緩解了這個(gè)問(wèn)題。文中,我們將Ajax定義為向web服務(wù)器產(chǎn)生異步調(diào)用而不引起網(wǎng)頁(yè)完全更新的方法。這種交互性的通過(guò)三種不同的組件實(shí)現(xiàn):客戶端腳本語(yǔ)言,XmlHttpRequest (XHR)對(duì)象和XML。
讓我簡(jiǎn)短地分別介紹一下這些組件。在請(qǐng)求響應(yīng)中,客戶端腳本語(yǔ)言被用來(lái)初始化服務(wù)器調(diào)用和程式的存取,及更新客戶瀏覽器的DOM。客戶端普遍使用JavaScript,由于他被知名瀏覽器普遍的采用。第二個(gè)組件是XHR對(duì)象,他是最重要的部分。JavaScript這類語(yǔ)言使用XHR對(duì)象在場(chǎng)景后面向web服務(wù)器發(fā)送請(qǐng)求,使用HTTP作為傳輸中介。接著是第三個(gè)組件,他的使用是必要的:XML是被交換信息的數(shù)據(jù)格式。
非常多站點(diǎn)使用JSON(JavaScript Object Notation)代替XML,因?yàn)槠涓尤菀捉馕霾槐啬敲炊喙芾淼馁M(fèi)用。使用JavaScript解析JSON,只需要簡(jiǎn)單的把他傳給eval()函數(shù)。另一方面,有人可能使用XPath解析返回的XML。同樣的,外面更有非常多”Ajax 站點(diǎn)”既不使用XML,也不使用JSON,而是僅僅發(fā)送無(wú)格式的動(dòng)態(tài)插入到網(wǎng)頁(yè)的舊HTML碎片。
因此,Ajax不是個(gè)新的技術(shù)商標(biāo),而是現(xiàn)存技術(shù)的聯(lián)合應(yīng)用,推動(dòng)了web應(yīng)用程式高度交互性的發(fā)展。實(shí)際上,所有這些組件已出現(xiàn)好些年了,隨Internet Explorer 5.0的發(fā)布而顯著起來(lái)。研發(fā)者創(chuàng)建了Ajax許多的應(yīng)用,諸如”提示”文本框(象Google Suggest)和自動(dòng)更新數(shù)據(jù)列表。所有的XHR請(qǐng)求仍然是由典型的服務(wù)器端框架執(zhí)行,例如標(biāo)準(zhǔn)的選擇象J2EE,.NET和PHP。下面的Figure 1. 是Ajax應(yīng)用程式的異步特性圖例:
圖 1.Ajax異步順序
3. Ajax安全應(yīng)用
目前我們已回顧了Ajax的基礎(chǔ),讓我們討論一下他的安全含義。在web應(yīng)用領(lǐng)域,Ajax本身并沒(méi)有引入新的安全弱點(diǎn)。這些應(yīng)用程式面臨和經(jīng)典web應(yīng)用程式同樣的問(wèn)題。不幸的是,Ajax共通的最佳實(shí)現(xiàn)還沒(méi)有發(fā)展起來(lái),這就留下了非常多的犯錯(cuò)誤的余地。其包括安全驗(yàn)證,授權(quán),存取控制和輸入檢查。[ref 2]。涉及Ajax使用的一些潛在領(lǐng)域包括:
?客戶端安全控制
有人認(rèn)為,客戶端程式的依賴性可能引出來(lái)一些已眾所周知的問(wèn)題。[ref 2]。一種可能性是研發(fā)者通過(guò)客戶端控制破壞安全。如前所述,Ajax的使用需要相當(dāng)多的腳本語(yǔ)言。如今,Web研發(fā)者同時(shí)寫服務(wù)器端和客戶端的代碼,這也許會(huì)吸引面向客戶端安全控制執(zhí)行的研發(fā)者。這種方式是非常不可靠的,因?yàn)楣粽咴跍y(cè)試應(yīng)用程式弱點(diǎn)時(shí),能修改運(yùn)行在他們客戶端計(jì)算機(jī)上的所有代碼。安全控制應(yīng)該完全在服務(wù)器上執(zhí)行或經(jīng)常在服務(wù)器上升級(jí)。
?不斷增加的攻擊面
第二個(gè)挑戰(zhàn)是保護(hù)不斷增加的攻擊面。Ajax不可避免的增加了系統(tǒng)的整體復(fù)雜性。在采用Ajax的過(guò)程中,研發(fā)者也許要編寫大量的服務(wù)器端頁(yè)面,每一個(gè)頁(yè)面執(zhí)行一些整個(gè)程式中的小功能(象為了自動(dòng)完成一個(gè)用戶的城市和州域,查尋郵政區(qū)號(hào))。這些小頁(yè)面將各自成為黑客的一個(gè)附加攻擊目標(biāo),而為了確保不引入新的安全弱點(diǎn)一個(gè)附加的點(diǎn)需要保護(hù)起來(lái)。這個(gè)能比喻成著名的多重點(diǎn)的安全觀點(diǎn)似乎進(jìn)入一個(gè)房子:保護(hù)只有一扇門的房子難度和保護(hù)有十扇門的房子相比。
?連接用戶和服務(wù)器之間的間隙
Ajax是研發(fā)者通過(guò)其縮短最終用戶和由面向服務(wù)構(gòu)架接口的距離的一種方法。[ref 3]增加寬松聯(lián)系的基于服務(wù)的構(gòu)架在企業(yè)環(huán)境中有許多好處,是一種非常有希望的方法。隨著更多的基于服務(wù)端點(diǎn)的發(fā)展,隨著Ajax引入向最終用戶提供更多的靈活的處理的可能,遠(yuǎn)離三層標(biāo)準(zhǔn)模型的可能性增加了。
一般來(lái)說(shuō),企業(yè)內(nèi)部的許多web服務(wù)(和Internet上的全部服務(wù)相對(duì))被設(shè)計(jì)成B2B,因此,設(shè)計(jì)者和研發(fā)者常常沒(méi)有考慮實(shí)際用戶的交互性。這個(gè)缺乏遠(yuǎn)見(jiàn)的做法導(dǎo)致了一些壞的設(shè)計(jì)過(guò)程中安全假設(shè)。例如,最初的設(shè)計(jì)者可能假設(shè)安全認(rèn)證,授權(quán)和輸入檢查將由其他中層系統(tǒng)執(zhí)行。一旦有人允許”外部人士”通過(guò)Ajax的使用直接調(diào)用這些服務(wù),就引入了一個(gè)考慮之外的代理。這類使用的一個(gè)實(shí)際例子是Microsoft的Atlas[ref 4]和web服務(wù)同時(shí)使用的一致性程度檢查。研發(fā)者目前能編寫JavaScript來(lái)生成XML輸入及從客戶端瀏覽器中正確調(diào)用web服務(wù)。在過(guò)去這個(gè)由代理和服務(wù)器完成。
?跨站腳本(XSS)的新希望
另外一個(gè)不幸的事實(shí)是攻擊者通過(guò)利用跨站腳本(XSS)的弱點(diǎn),能夠更有創(chuàng)造性(換句話說(shuō),更危險(xiǎn))。[ref 5]黑客過(guò)去一般在”單線程”環(huán)境下使用XSS漏洞,攻擊執(zhí)行的時(shí)候用戶的瀏覽器處于等待狀態(tài)。這個(gè)等待狀態(tài)提供了一個(gè)可能錯(cuò)誤執(zhí)行程式用戶的線索。通過(guò)Ajax的引入,一個(gè)攻擊者能以更加隱秘的方式利用跨站腳本弱點(diǎn)。當(dāng)你用一個(gè)允許Ajax的程式檢查你的郵件的時(shí)候,惡意代碼可能給你所有的朋友發(fā)送Email而你的瀏覽器不會(huì)留下所有可見(jiàn)的痕跡。
為了解決這方面的問(wèn)題,在把程式放到產(chǎn)品中之前,必須執(zhí)行足夠多的有針對(duì)性的安全測(cè)試。即使Ajax程式是web應(yīng)用程式,由于這些應(yīng)用程式高度交互性的特點(diǎn),一個(gè)組織好的現(xiàn)存的安全測(cè)試方法可能是不夠的。
4.Ajax怎么
測(cè)試一個(gè)正常web應(yīng)用程式的時(shí)候,一個(gè)入侵測(cè)試者從footprint應(yīng)用程式開(kāi)始。Footprint階段的目的是捕捉請(qǐng)求和響應(yīng),這樣測(cè)試者就知道應(yīng)用程式怎么和服務(wù)器通信及他所接收到的響應(yīng)。這個(gè)信息通過(guò)本地代理諸如Burp[ref 6]或Paros[ref 7]記入日志。footprint階段,必須盡可能做到全方面,因此測(cè)試者日志向應(yīng)用程式使用的所有頁(yè)面發(fā)出請(qǐng)求。
之后,測(cè)試者將開(kāi)始系統(tǒng)的錯(cuò)誤注入過(guò)程,手動(dòng)或使用自動(dòng)工具來(lái)測(cè)試從web服務(wù)器上傳入傳出的參數(shù)。
?“狀態(tài)”問(wèn)題
在一般的web應(yīng)用程式世界里,應(yīng)用程式的狀態(tài)被明確的定義。存在于一個(gè)頁(yè)面的DOM中的每一個(gè)事物都能被認(rèn)為是頁(yè)面的當(dāng)前狀態(tài)。如果狀態(tài)需要改動(dòng),一個(gè)請(qǐng)求就被發(fā)送到服務(wù)器,而響應(yīng)周詳說(shuō)明了狀態(tài)怎么改動(dòng)。
?通過(guò)定時(shí)器事件初始化請(qǐng)求
這涉及到通過(guò)基于定時(shí)器的事件而不必所有用戶交互的更新用戶界面。應(yīng)用程式可能定時(shí)的發(fā)送請(qǐng)求到服務(wù)器來(lái)更新web頁(yè)面上的信息。例如,一個(gè)金融應(yīng)用程式可能使用XHR對(duì)象更新顯示當(dāng)前股票市場(chǎng)信息的網(wǎng)頁(yè)部分內(nèi)容。測(cè)試者可能不會(huì)注意到后臺(tái)的進(jìn)程,如果他們沒(méi)有在正確的時(shí)間捕捉到請(qǐng)求,因?yàn)檫@里可能沒(méi)有可見(jiàn)的鏈接或按鈕來(lái)提醒測(cè)試者后臺(tái)有請(qǐng)求產(chǎn)生了。
?動(dòng)態(tài)DOM更新
Ajax響應(yīng)能包含JaveScript片斷,他能被web應(yīng)用程式評(píng)價(jià)而且能在用戶接口中出現(xiàn)。這可能包括新的鏈接,服務(wù)器上新的文件的存儲(chǔ),等等。實(shí)現(xiàn)這個(gè)的一種方式是通過(guò)使用eval()聲明。[ref 2,ref 8]eval()聲明接受一個(gè)單變量,一個(gè)字符串,而且執(zhí)行這個(gè)字符串,就像他是程式的一部分相同。
Google Suggest是個(gè)非常好的例子,其中應(yīng)用程式接收到一個(gè)JavaScript片斷,這個(gè)片斷得到評(píng)價(jià)而且作為完成輸入詢問(wèn)的可能建議。這個(gè)行為對(duì)于手動(dòng)測(cè)試者和使用自動(dòng)工具的測(cè)試者都有問(wèn)題的。兩者將不得不了解JavaScript在web應(yīng)用程式的上下文中是怎么使用的。當(dāng)一個(gè)輸入?yún)?shù)在客戶端計(jì)算后被送回來(lái)的時(shí)候就需要格外小心。這個(gè)聽(tīng)起來(lái)象典型的XSS而且他就是,不過(guò)他已變得非常容易被利用。使用黑名單確認(rèn)的應(yīng)用程式更加容易受到影響,因?yàn)楣粽卟槐刈⑷朐S多標(biāo)記。一些方法能被用來(lái)使用XSS而不需象過(guò)去那樣的腳本標(biāo)簽。
?XML Fuzzing
Ajax能被用來(lái)以XML的格式發(fā)送請(qǐng)求接收響應(yīng)。簡(jiǎn)單的自動(dòng)工具確實(shí)理解GET和POST方法不過(guò)可能不知道怎么處理使用XML格式封裝的信息。
測(cè)試者必須確保研發(fā)者沒(méi)有偏離一個(gè)安全的構(gòu)架。在一個(gè)安全系統(tǒng)中,安全控制在一個(gè)最終用戶控制之外的環(huán)境中實(shí)行。執(zhí)行reviews的時(shí)候,你必須完全審查客戶端代碼以確定是否能在提交變量(cookies, FORM參數(shù), GET參數(shù))給服務(wù)器之前修改他們的狀態(tài)。一旦發(fā)生了這個(gè),就需要分析JavaScript來(lái)確定原因。
就如一般的web應(yīng)用程式相同,所有的Ajax請(qǐng)求需要為授權(quán)問(wèn)題進(jìn)行測(cè)試。研發(fā)者相信因?yàn)轫?yè)面在一個(gè)客戶端腳本引擎后面調(diào)用就不必授權(quán),那他就可能成為受害者。實(shí)際上并非如此。
5.結(jié)論
Ajax應(yīng)用程式通過(guò)他高度交互性的特性提供了新的可能性。研發(fā)者可能對(duì)這些性能引入的新的不安全因素感到厭倦。安全測(cè)試者必須增加他們的測(cè)試方法和工具集來(lái)應(yīng)付Ajax應(yīng)用程式。
這篇文章中,作者介紹了一些Ajax技術(shù)中的安全應(yīng)用。入侵測(cè)試者正看到他們已擁有知識(shí)和工具來(lái)評(píng)價(jià)Ajax應(yīng)用程式,不過(guò)他們還是有點(diǎn)難于測(cè)試。后面的文章將關(guān)注這個(gè)問(wèn)題的更多方面,象能在Ajax安全測(cè)試中使用的有幫助的工具。
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.進(jìn)一步的閱讀材料
?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. 關(guān)于作者
Jaswinder S. Hayre, CISSP, 和Jayasankar Kelath, CISSP,都是紐約Ernst & Young’s Advanced Security Center的高級(jí)安全工程師。
>
地 址:北京市海淀區(qū)建材城中路12號(hào)院17號(hào)樓1層119室
武漢分公司地址:湖北省武漢市洪山區(qū)南國(guó)雄楚廣場(chǎng)A4棟2011室
鄭州分公司地址:河南鄭州金水區(qū)東風(fēng)路科技市場(chǎng)對(duì)面米蘭陽(yáng)光6號(hào)樓917室
郵 箱:haidanet@163.com
24小時(shí)聯(lián)系電話: 15201609116 13651084380