趙玉龍 張旋 劉夢瑤 李沁蕾
華中科技大學計算機科學與技術學院 湖北 430074
隨著Internet的發展,基于Web和數據庫架構的應用系統已經逐漸成為主流,廣泛應用于企業內部和外部的業務系統中。各種基于 Web 應用的業務模式不斷成熟,但是各種網絡安全事件也隨之不斷發生。據國家計算機網絡應急技術處理協調中心(CNCERT/CC)的統計,2007年接收的網絡仿冒事件和網頁惡意代碼事件,分別超出2006年總數的近1.4倍和 2.6倍;賽門鐵克(Symantec)公司 2008年 4月發布的Symantec Internet Security Threat Report中提到,2007年下半年有超過80%的網站都或多或少地有著XSS漏洞;而2008年5月,我國大陸地區被篡改網站的數量就有6915個。近日,微軟安全應急小組確認了微軟SharePoint Server 2007產品中的嚴重的跨站腳本漏洞(XSS)的存在。各種Web 應用的安全事件嚴重影響了Web 應用的發展,其中基于XSS漏洞的攻擊尤為嚴重。
隨著各種網站程序設計及網站管理設置的安全程度越來越高,各類惡意的入侵攻擊者都被阻擋在網站安全防線之外,攻擊者想要入侵攻擊某個網站服務器,是越來越困難的事情。于是攻擊者的入侵目標轉向了網站的瀏覽者。
由于HTML語言支持腳本語言嵌入頁面中的機制,從而引發了腳本的安全問題。XSS(Cross-Site Scripting)是最常見的一種應用層的攻擊。XSS 攻擊基本上是將攻擊代碼注入到各種瀏覽器的解釋過程中,同時利用 XSS 漏洞旁路調用訪問控制——例如同源策略;這種攻擊可以使用各種客戶端語言實現,而且這種類型的漏洞往往被用來編寫危害性更大的phishing攻擊和利用瀏覽器漏洞的攻擊。
利用跨站漏洞入侵者可以進行非常多的攻擊,例如盜取別人Cookie中的賬號和密碼,或者偽造頁面,或者進行掛馬,總之跨站漏洞是一個危害性很大的漏洞。
(1)反射型(又稱非持久型)XSS攻擊
如果一個應用程序使用動態頁面向用戶顯示錯誤消息,就會造成這種常見的XSS漏洞。通常,該頁面會使用一個包含消息文本的參數,并在響應中將這個文本返回給用戶。
開發人員可能沒有對輸入進行過濾。那么就可能產生不良后果。例如:輸入一段腳本來進行測試<script>alert(“XSS”)</script>如圖 1。

圖1 測試界面
如果開發人員沒有進行過濾,那么,頁面中將會彈出一個帶有“XSS”對話框如圖2所示。
(2)保存型(又稱持久型)XSS攻擊
如果一名用戶提交的數據被保存在應用程序中,(通常保存在一個后端數據庫中),然后不經適當過濾或凈化,就顯示給其他用戶,此時就會出現這種漏洞。在支持終端用戶交互的應用程序中,或者在具有管理權限的員工訪問同一個應用程序中的用戶記錄和數據的應用程序中,保存型XSS漏洞很常見。

圖2 帶有“XSS”對話框
一般情況下,利用保存型XSS漏洞的攻擊至少需要向應用程序提出兩個請求。攻擊者在第一個請求中傳送一些專門設計的數據,其中包含惡意代碼;應用程序接受并保存這些數據。在第二個請求中,一名受害者查看某個包含攻擊者的數據的頁面,這時惡意代碼開始執行。為此,這種漏洞有時也叫做二階跨站點腳本。
例如在一個正常的留言板頁面中,如果對用戶輸入的字符沒有加以限制,在發表新留言中嵌入代碼</script><iframe height=500 width=500 src="http://www.baidu.com"></iframe>當留言成功后,如果其他用戶訪問該留言板時就會發現在留言板中嵌入了一個百度搜索的框體(如圖3)。

圖3 保存型XSS攻擊
(3)基于DOM的XSS攻擊
DOM-bassed XSS是基于文件對象模型(Document Object Model)的一種漏洞,DOM 是一種與平臺編程語言無關的接口,它允許程序或腳本動態地訪問和更新文檔的內容、結構和樣式,處理后成為顯示頁面的一部分,DOM中的URL,location,referrer等內容都是用戶可以操縱的,客戶端腳本程序可以動態修改頁面內容,而不是依賴于提交給服務器的數據,而從客戶端獲得的DOM中的數據沒有嚴格確認,就會產生基于DOM的XSS漏洞。
例如 HTTP請求一個頁面 HTTP://www.xxx.com/print.html?user=ABC實際上是使用了一個腳本輸出用戶名,但是如果把user=ABC改為<script>alert(“hello”)</script>就會導致XSS攻擊。當用戶訪問這個頁面就會彈出一個窗口。
如果腳本處寫的是惡意代碼,并且將這個 URL發給其他用戶,就會導致其他用戶在不知情的情況下執行了惡意的代碼。
(1)掛馬
利用保存型XSS漏洞可以進行掛馬,保存型跨站腳本攻擊可以利用頁面的輸入框體對信息過濾不嚴格嵌入 JavaScript腳本,導致其他用戶訪問該頁面時運行腳本。這個漏洞便可以利用進行掛馬。
從上面嵌入網頁框架可以看出,如果訪問一個網站,該網站被嵌入了其他網站的框架,另一個網站也會被訪問。因此我們可以構建一個長度和寬度均為0的網頁框架,在網頁框架中會打開填寫的網頁地址,代碼如下:</script><iframe height=0 width=0 src="http://www.木馬.com"></iframe>而且該網頁在頁面中是完全隱蔽的,從外觀上看不出與正常頁面任何的不同。但是,訪問正常頁面的用戶不知不覺中卻訪問了另一個包含有木馬的網站,瀏覽器可能會下載一份木馬到本地計算機上。
或者也有可能嵌入的 JavaScript腳本本身就是一段惡意的代碼,可以在訪問者的本地執行一些非法的操作。
(2)cookie盜取
假設有一個論壇,該論壇用cookie來存儲用戶的登錄信息。而此論壇的用戶信息頁面存在一個XSS漏洞,比如說個人簡介欄中。Bob是一個攻擊者,他發現了該論壇的這個漏洞,而且Bob擁有一個www.attacker.com的域,那么Bob就具備了攻擊的條件。
首先,Bob注冊成為這個論壇的用戶,盡可能多的在自己的 ID中增加有吸引力的元素,然后在自己的個人簡介等處添加代碼,并且Bob在自己的域中架設一個服務器,這時普通用戶Alice在查看Bob的個人簡介的時候也會向B的服務器中提交自己訪問論壇等地方的COOKIE,這時Bob可以利用獲得的COOKIE冒充Alice用戶登錄論壇,如果Alice用戶是一個管理員的話,此時Bob將獲得論壇的管理員權限。
或者如果論壇中存在基于DOM型的XSS漏洞時,Bob只需要發送給Alice類似于http://www.luntan.com/login.php?message= <script>var+i=new+Image;+i.src=” http://www.attacker.com/”+document.cookie;</script>這樣的鏈接時,Alice可能就會因為點擊了這樣的鏈接登錄論壇而導致COOKIE被竊取。
跨站腳本攻擊具有相當大的危害性,而且跨站腳本攻擊相對于其他網絡漏洞攻擊而說,它具有更加隱蔽的特點。因此它的防范也更加困難。XSS攻擊產生在用戶和Web程序交互的過程中,因此防范跨站腳本攻擊需要我們在編碼上和用戶安全意識上兩方面入手采取相應的防范手段。
(1)編碼過程中對非法字符串進行處理
① 確認輸入串的規則和長度
如果網站需要保存或者對用戶提交的數據進行反應時,網站應用程序應當對用戶提交的數據進行盡可能嚴格的確認,應當保證:
數據的長度不要太長;
數據盡包含合法的字符串;
數據應當與相應的正規表達式相匹配,例如對電子郵件地址和姓名應當使用不同的確認規則。
② 將字符串進行編碼輸出
網站也應當對用戶提交的數據進行HTML編碼,以過濾可能產生的惡意字符。這樣可以保證瀏覽器在瀏覽到惡意代碼時可以安全的處理,把惡意的字符當做是HTML文檔的內容而非是結構。例如將字符HTML編碼如下:
" "
' '
& &
< <
> >
③ 過濾特殊的輸入字符
由于產生惡意腳本大部分是由于執行了"<>"等惡意的標簽或者字符內容,因此我們應當將用戶輸入的可能在HTML里產生腳本的惡意字符進行過濾掉,禁止用戶提交該類代碼這類字符主要包括“< > " ' % ; ( ) & + -”等。
④ 對可能造成跨站攻擊的地方進行審查
在網站的頁面上有一些位置是用來給用戶提交輸入的地方,在對這些地方編寫代碼的時候應當進行特別的審查和測試防止有方式可以注入惡意的字符串,在審查的時候可以利用一些開源的審查軟件如:RatProxy等對網站的安全性進行測評。
(2)作為網絡用戶的防范措施
只訪問可信任的站點,而且在訪問信任站點的時候最好是通過地址欄直接輸入地址進行訪問而不是通過其他站點的鏈接;
不要輕易訪問其他人給你的鏈接,特別是跟了很長一段字符串的鏈接,因為這段字符可能是惡意的腳本進行編碼后的結果;
禁止瀏覽器直接不經過任何限制的運行 JavaScript或者ActiveX.;
定時對防病毒軟件和防火墻進行升級。
跨站腳本攻擊不同于普通的針對網站或者針對服務器的攻擊,此類攻擊往往不易引起網站應用程序開發者的注意和重視,然而正是如此,跨站腳本攻擊才會對網站的正常訪問者造成非常大的安全威脅。為了防范跨站腳本漏洞和攻擊不僅僅需要網站開發和建設者的努力,更需要瀏覽器的制作商的支持,以及網絡用戶的安全意識的提高,因此,針對跨站腳本攻擊已經成為了網絡安全領域的熱點話題。
[1] Daffdd Stuttard,Marcus Pinto著,石華耀等譯.黑客攻防技術寶典(web實戰篇).人民郵電出版社.2009.
[2] 逍遙.網站入侵與腳本攻防修煉.電子工業出版社.2008.
[3] 古開元,周安民.跨站腳本攻擊原理與防范.網絡安全技術與應用.2006.
[4] 黃文鋒.DOM-based XSS攻擊原理與防范.華南金融電腦.2009.