趙玉龍 張旋 劉夢瑤 李沁蕾
華中科技大學(xué)計算機科學(xué)與技術(shù)學(xué)院 湖北 430074
隨著Internet的發(fā)展,基于Web和數(shù)據(jù)庫架構(gòu)的應(yīng)用系統(tǒng)已經(jīng)逐漸成為主流,廣泛應(yīng)用于企業(yè)內(nèi)部和外部的業(yè)務(wù)系統(tǒng)中。各種基于 Web 應(yīng)用的業(yè)務(wù)模式不斷成熟,但是各種網(wǎng)絡(luò)安全事件也隨之不斷發(fā)生。據(jù)國家計算機網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心(CNCERT/CC)的統(tǒng)計,2007年接收的網(wǎng)絡(luò)仿冒事件和網(wǎng)頁惡意代碼事件,分別超出2006年總數(shù)的近1.4倍和 2.6倍;賽門鐵克(Symantec)公司 2008年 4月發(fā)布的Symantec Internet Security Threat Report中提到,2007年下半年有超過80%的網(wǎng)站都或多或少地有著XSS漏洞;而2008年5月,我國大陸地區(qū)被篡改網(wǎng)站的數(shù)量就有6915個。近日,微軟安全應(yīng)急小組確認(rèn)了微軟SharePoint Server 2007產(chǎn)品中的嚴(yán)重的跨站腳本漏洞(XSS)的存在。各種Web 應(yīng)用的安全事件嚴(yán)重影響了Web 應(yīng)用的發(fā)展,其中基于XSS漏洞的攻擊尤為嚴(yán)重。
隨著各種網(wǎng)站程序設(shè)計及網(wǎng)站管理設(shè)置的安全程度越來越高,各類惡意的入侵攻擊者都被阻擋在網(wǎng)站安全防線之外,攻擊者想要入侵攻擊某個網(wǎng)站服務(wù)器,是越來越困難的事情。于是攻擊者的入侵目標(biāo)轉(zhuǎn)向了網(wǎng)站的瀏覽者。
由于HTML語言支持腳本語言嵌入頁面中的機制,從而引發(fā)了腳本的安全問題。XSS(Cross-Site Scripting)是最常見的一種應(yīng)用層的攻擊。XSS 攻擊基本上是將攻擊代碼注入到各種瀏覽器的解釋過程中,同時利用 XSS 漏洞旁路調(diào)用訪問控制——例如同源策略;這種攻擊可以使用各種客戶端語言實現(xiàn),而且這種類型的漏洞往往被用來編寫危害性更大的phishing攻擊和利用瀏覽器漏洞的攻擊。
利用跨站漏洞入侵者可以進行非常多的攻擊,例如盜取別人Cookie中的賬號和密碼,或者偽造頁面,或者進行掛馬,總之跨站漏洞是一個危害性很大的漏洞。
(1)反射型(又稱非持久型)XSS攻擊
如果一個應(yīng)用程序使用動態(tài)頁面向用戶顯示錯誤消息,就會造成這種常見的XSS漏洞。通常,該頁面會使用一個包含消息文本的參數(shù),并在響應(yīng)中將這個文本返回給用戶。
開發(fā)人員可能沒有對輸入進行過濾。那么就可能產(chǎn)生不良后果。例如:輸入一段腳本來進行測試<script>alert(“XSS”)</script>如圖 1。
圖1 測試界面
如果開發(fā)人員沒有進行過濾,那么,頁面中將會彈出一個帶有“XSS”對話框如圖2所示。
(2)保存型(又稱持久型)XSS攻擊
如果一名用戶提交的數(shù)據(jù)被保存在應(yīng)用程序中,(通常保存在一個后端數(shù)據(jù)庫中),然后不經(jīng)適當(dāng)過濾或凈化,就顯示給其他用戶,此時就會出現(xiàn)這種漏洞。在支持終端用戶交互的應(yīng)用程序中,或者在具有管理權(quán)限的員工訪問同一個應(yīng)用程序中的用戶記錄和數(shù)據(jù)的應(yīng)用程序中,保存型XSS漏洞很常見。
圖2 帶有“XSS”對話框
一般情況下,利用保存型XSS漏洞的攻擊至少需要向應(yīng)用程序提出兩個請求。攻擊者在第一個請求中傳送一些專門設(shè)計的數(shù)據(jù),其中包含惡意代碼;應(yīng)用程序接受并保存這些數(shù)據(jù)。在第二個請求中,一名受害者查看某個包含攻擊者的數(shù)據(jù)的頁面,這時惡意代碼開始執(zhí)行。為此,這種漏洞有時也叫做二階跨站點腳本。
例如在一個正常的留言板頁面中,如果對用戶輸入的字符沒有加以限制,在發(fā)表新留言中嵌入代碼</script><iframe height=500 width=500 src="http://www.baidu.com"></iframe>當(dāng)留言成功后,如果其他用戶訪問該留言板時就會發(fā)現(xiàn)在留言板中嵌入了一個百度搜索的框體(如圖3)。
圖3 保存型XSS攻擊
(3)基于DOM的XSS攻擊
DOM-bassed XSS是基于文件對象模型(Document Object Model)的一種漏洞,DOM 是一種與平臺編程語言無關(guān)的接口,它允許程序或腳本動態(tài)地訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式,處理后成為顯示頁面的一部分,DOM中的URL,location,referrer等內(nèi)容都是用戶可以操縱的,客戶端腳本程序可以動態(tài)修改頁面內(nèi)容,而不是依賴于提交給服務(wù)器的數(shù)據(jù),而從客戶端獲得的DOM中的數(shù)據(jù)沒有嚴(yán)格確認(rèn),就會產(chǎn)生基于DOM的XSS漏洞。
例如 HTTP請求一個頁面 HTTP://www.xxx.com/print.html?user=ABC實際上是使用了一個腳本輸出用戶名,但是如果把user=ABC改為<script>alert(“hello”)</script>就會導(dǎo)致XSS攻擊。當(dāng)用戶訪問這個頁面就會彈出一個窗口。
如果腳本處寫的是惡意代碼,并且將這個 URL發(fā)給其他用戶,就會導(dǎo)致其他用戶在不知情的情況下執(zhí)行了惡意的代碼。
(1)掛馬
利用保存型XSS漏洞可以進行掛馬,保存型跨站腳本攻擊可以利用頁面的輸入框體對信息過濾不嚴(yán)格嵌入 JavaScript腳本,導(dǎo)致其他用戶訪問該頁面時運行腳本。這個漏洞便可以利用進行掛馬。
從上面嵌入網(wǎng)頁框架可以看出,如果訪問一個網(wǎng)站,該網(wǎng)站被嵌入了其他網(wǎng)站的框架,另一個網(wǎng)站也會被訪問。因此我們可以構(gòu)建一個長度和寬度均為0的網(wǎng)頁框架,在網(wǎng)頁框架中會打開填寫的網(wǎng)頁地址,代碼如下:</script><iframe height=0 width=0 src="http://www.木馬.com"></iframe>而且該網(wǎng)頁在頁面中是完全隱蔽的,從外觀上看不出與正常頁面任何的不同。但是,訪問正常頁面的用戶不知不覺中卻訪問了另一個包含有木馬的網(wǎng)站,瀏覽器可能會下載一份木馬到本地計算機上。
或者也有可能嵌入的 JavaScript腳本本身就是一段惡意的代碼,可以在訪問者的本地執(zhí)行一些非法的操作。
(2)cookie盜取
假設(shè)有一個論壇,該論壇用cookie來存儲用戶的登錄信息。而此論壇的用戶信息頁面存在一個XSS漏洞,比如說個人簡介欄中。Bob是一個攻擊者,他發(fā)現(xiàn)了該論壇的這個漏洞,而且Bob擁有一個www.attacker.com的域,那么Bob就具備了攻擊的條件。
首先,Bob注冊成為這個論壇的用戶,盡可能多的在自己的 ID中增加有吸引力的元素,然后在自己的個人簡介等處添加代碼,并且Bob在自己的域中架設(shè)一個服務(wù)器,這時普通用戶Alice在查看Bob的個人簡介的時候也會向B的服務(wù)器中提交自己訪問論壇等地方的COOKIE,這時Bob可以利用獲得的COOKIE冒充Alice用戶登錄論壇,如果Alice用戶是一個管理員的話,此時Bob將獲得論壇的管理員權(quán)限。
或者如果論壇中存在基于DOM型的XSS漏洞時,Bob只需要發(fā)送給Alice類似于http://www.luntan.com/login.php?message= <script>var+i=new+Image;+i.src=” http://www.attacker.com/”+document.cookie;</script>這樣的鏈接時,Alice可能就會因為點擊了這樣的鏈接登錄論壇而導(dǎo)致COOKIE被竊取。
跨站腳本攻擊具有相當(dāng)大的危害性,而且跨站腳本攻擊相對于其他網(wǎng)絡(luò)漏洞攻擊而說,它具有更加隱蔽的特點。因此它的防范也更加困難。XSS攻擊產(chǎn)生在用戶和Web程序交互的過程中,因此防范跨站腳本攻擊需要我們在編碼上和用戶安全意識上兩方面入手采取相應(yīng)的防范手段。
(1)編碼過程中對非法字符串進行處理
① 確認(rèn)輸入串的規(guī)則和長度
如果網(wǎng)站需要保存或者對用戶提交的數(shù)據(jù)進行反應(yīng)時,網(wǎng)站應(yīng)用程序應(yīng)當(dāng)對用戶提交的數(shù)據(jù)進行盡可能嚴(yán)格的確認(rèn),應(yīng)當(dāng)保證:
數(shù)據(jù)的長度不要太長;
數(shù)據(jù)盡包含合法的字符串;
數(shù)據(jù)應(yīng)當(dāng)與相應(yīng)的正規(guī)表達式相匹配,例如對電子郵件地址和姓名應(yīng)當(dāng)使用不同的確認(rèn)規(guī)則。
② 將字符串進行編碼輸出
網(wǎng)站也應(yīng)當(dāng)對用戶提交的數(shù)據(jù)進行HTML編碼,以過濾可能產(chǎn)生的惡意字符。這樣可以保證瀏覽器在瀏覽到惡意代碼時可以安全的處理,把惡意的字符當(dāng)做是HTML文檔的內(nèi)容而非是結(jié)構(gòu)。例如將字符HTML編碼如下:
" "
' '
& &
< <
> >
③ 過濾特殊的輸入字符
由于產(chǎn)生惡意腳本大部分是由于執(zhí)行了"<>"等惡意的標(biāo)簽或者字符內(nèi)容,因此我們應(yīng)當(dāng)將用戶輸入的可能在HTML里產(chǎn)生腳本的惡意字符進行過濾掉,禁止用戶提交該類代碼這類字符主要包括“< > " ' % ; ( ) & + -”等。
④ 對可能造成跨站攻擊的地方進行審查
在網(wǎng)站的頁面上有一些位置是用來給用戶提交輸入的地方,在對這些地方編寫代碼的時候應(yīng)當(dāng)進行特別的審查和測試防止有方式可以注入惡意的字符串,在審查的時候可以利用一些開源的審查軟件如:RatProxy等對網(wǎng)站的安全性進行測評。
(2)作為網(wǎng)絡(luò)用戶的防范措施
只訪問可信任的站點,而且在訪問信任站點的時候最好是通過地址欄直接輸入地址進行訪問而不是通過其他站點的鏈接;
不要輕易訪問其他人給你的鏈接,特別是跟了很長一段字符串的鏈接,因為這段字符可能是惡意的腳本進行編碼后的結(jié)果;
禁止瀏覽器直接不經(jīng)過任何限制的運行 JavaScript或者ActiveX.;
定時對防病毒軟件和防火墻進行升級。
跨站腳本攻擊不同于普通的針對網(wǎng)站或者針對服務(wù)器的攻擊,此類攻擊往往不易引起網(wǎng)站應(yīng)用程序開發(fā)者的注意和重視,然而正是如此,跨站腳本攻擊才會對網(wǎng)站的正常訪問者造成非常大的安全威脅。為了防范跨站腳本漏洞和攻擊不僅僅需要網(wǎng)站開發(fā)和建設(shè)者的努力,更需要瀏覽器的制作商的支持,以及網(wǎng)絡(luò)用戶的安全意識的提高,因此,針對跨站腳本攻擊已經(jīng)成為了網(wǎng)絡(luò)安全領(lǐng)域的熱點話題。
[1] Daffdd Stuttard,Marcus Pinto著,石華耀等譯.黑客攻防技術(shù)寶典(web實戰(zhàn)篇).人民郵電出版社.2009.
[2] 逍遙.網(wǎng)站入侵與腳本攻防修煉.電子工業(yè)出版社.2008.
[3] 古開元,周安民.跨站腳本攻擊原理與防范.網(wǎng)絡(luò)安全技術(shù)與應(yīng)用.2006.
[4] 黃文鋒.DOM-based XSS攻擊原理與防范.華南金融電腦.2009.