基於網絡爬蟲的XSS漏洞檢測技術

1.   背景和意義

在早期的網站設計中,網頁的存在形式都是靜態的。靜態的網頁內容穩定,不會經常更新,但是在後期卻不易維護。如果需要維護更新網頁,則必須重新編輯HTML網頁,因此當網站很龐大的時候,維護靜態網頁的工作量幾乎是不能容忍的。隨着時代的發展,在這方面發展出來一大批的動態網站技術,比如JSP,ASP,PHP等。這些網站技術的動態性主要體現在其相應網頁的形成過程是動態的,即網頁內容會根據用戶的需求和和選擇而動態的改變,而需要改變的內容則來源於數據庫。雖然這樣的技術更符合時代的需求,但是動態網頁也容易受到一些攻擊,最爲常見的應用層攻擊就有XSS攻擊,SQL注入攻擊等。其中XSS攻擊是:攻擊者在Web網頁內注入惡意的腳本代碼,然而當信任服務器的用戶打開該網站瀏覽該網頁的時候,嵌入在Web網頁內的惡意代碼就會在用戶知情的情況下被執行,從而達到攻擊的目的。

網絡爬蟲的主要功能是自動瀏覽並扒取互聯網網頁。網絡爬蟲是搜索引擎的基礎架構之一,它決定着是搜索引擎的數據來源,如果一些存在XSS漏洞的網頁被網絡爬蟲所扒取的話,用戶在使用搜索結果的時候,很容易受到XSS攻擊,因此搜索引擎的性能評價肯定會收到影響。[1]

由於以上的原因,可見在網絡爬蟲進行網頁獲取的時候,對網頁進行XSS漏洞檢測的重要性。這樣做的目的,不僅可以保護搜索引擎用戶的安全性,同時也可以間接的遏止XSS攻擊的傳播。

 

2.   相關技術介紹


2.1.   XSS漏洞

由於在HTML語言允許嵌入腳本語言,從而導致了腳本的安全問題。其中XSS(Cross SiteScript)是最爲常見的腳本攻擊方法。XSS攻擊是攻擊者將自己的腳本代碼注入到有Web應用程序生成的網頁中,當有用戶瀏覽該網頁時,攻擊者的腳本可以被解釋執行,從而達到攻擊的目的。

     

2.1.1.         XSS漏洞分類

XSS可以主要分爲以下3種:

(1).非持久性XSS(Reflected XSS)

顧名思義,這種類型的XSS攻擊是非持久化的。它常出現在Web客戶端向Web服務器發送一些請求時,在請求中攜帶惡意腳本代碼。當請求被響應時,請求中的惡意腳本代碼有可能被執行,從而受到攻擊。這樣的攻擊是非持久化的,它必須用戶在點擊帶有惡意代碼的鏈接時纔會引起。

(2).持久性XSS(Stored XSS)

這類的XSS漏洞主要是已經被持久化到了網站的數據庫內。當動態網頁動態生成的時候,網頁生成器從數據庫中調用數據,而持久化XSS漏洞則可能存在這些數據中,即有可能已經有惡意腳本代碼存在於這些,所以只要用戶瀏覽該網頁,惡意腳本代碼就會被解釋執行,從而受到攻擊。最常見的持久化XSS攻擊,就是在網站的留言板中輸入惡意腳本代碼並提交,如果該網站不對提交的留言就行XSS防禦的話,那麼該攜帶惡意腳本代碼的瀏覽就會被持久化進數據庫。

(3).基於DOM的XSS(DOM-based XSS)

基於DOM的XSS攻擊主要存在於頁面中客戶端本身。客戶端的腳本程序是可以通過本地的DOM動態地改變頁面內容,但是如何這些DOM的數據沒有經過嚴格的檢查確認的話,那麼就可能存在DOM-based XSS。

2.1.2.         XSS防禦

由XSS漏洞的分類可知,XSS的攻擊從屬於Client/Server模型,那麼XSS的防禦也可以從這兩個方面入手。

(1).Server端防禦

如持久性XSS漏洞,是由於在服務器端對於用戶的輸入沒有進行合理的驗證確認,從而使得XSS攻擊可能形成。因此,服務器端防禦XSS攻擊的主要方法是對用戶輸入進行嚴格的驗證審查,具體方法:對輸入的數據進行驗證、過濾用戶數據、移除或者加密特殊字符等。

(2).Client端防禦

客戶端的防禦主要還是基於用戶瀏覽器。一些具體的途徑主要如下:點擊直接、確定的鏈接,不要點擊不受信任的網頁或者郵件等;禁止腳本的運行;不斷對瀏覽器進行升級。因爲瀏覽器爲了保護用戶的安全,在XSS防禦上也在不斷的進步。

 

2.2.   網絡爬蟲

由於本文所要綜述的技術是應用在網絡爬蟲中的,所以在涉及具體的技術之前,先來介紹一下網絡爬蟲的模型。

網絡爬蟲又稱自動索引器、網絡機器人等,本質是自動瀏覽互聯網的程序。網絡爬蟲一般都是從一個種子集的URL集合開始扒取網頁,首先將這些URL放入待搜索隊列,採取某種策略從該隊列中提取URL,扒取網頁,分析網頁內容,將獲取的網頁放入已搜索隊列,以此反覆,最終達到某個停止扒取的條件[2],大致流程如圖2-1:


2‑1網絡爬蟲示意圖

其中關於網絡爬蟲的類型,以及普遍的網絡爬蟲爬行算法,都是搜索引擎的重要的基礎。

網絡爬蟲自始至終會保存兩個列表:待扒取URL隊列,已扒取URL隊列。由以上的圖可知,在通過某個URL進行網頁扒取的時候,會遇到很多網頁中的超鏈接,比較常見的標籤有:<ahref=”URL”>……</a>、<img src=”URL”>、<frame src=”URL”>……</frame>等。在一般的網絡爬蟲中,不管這些鏈接是否安全,都會一如既往地將其扒取,並且放入已扒取隊列。

 

3.   國內外發展現狀

由於XSS使用的攻擊代碼千變萬化,當網絡應用開發人員在設計開發的時候不可能對所有的用戶輸入進行全方位的檢測,所以XSS在國內外都是廣泛存在的,並且已經逐漸代替了緩衝區溢出等傳統型的攻擊方式,儼然成爲網絡安全方面不容忽視的重要難題。

國際Web應用安全組織WASC(Web Application Security Consortium)的統計數據,總共採樣分析10297個網站,其中就有31.47%的站點存在XSS漏洞。其中像Google、Yahoo等國際著名IT公司都存在XSS漏洞,另外在商業產品中,平均每個都能發現大概10~25個XSS漏洞[3]

XSS漏洞最早的出現實在1996年,但是在4年之後才被公佈。國內關於XSS漏洞的最早資料,也是在2000年。另外2006年,PayPal遭到XSS攻擊,攻擊者將PayPal站點的訪問者重定向到一個新的頁面,這個新的頁面警告用戶他們的賬號已經不再安全,需要重新設置,並提示輸入密碼。2008年PayPal承認其PayPal頁面受到XSS攻擊,該XSS漏洞會被攻擊者用於盜取用戶證書或者cookie[4]

 

4.   主要技術實現

4.1.  基本方案概述

由於目前網站動態網頁技術的發展迅速,並且已經誕生出衆多動態網頁源碼編寫語言,故使用在網絡爬蟲中對所有網頁進行源碼分析,變得不切實際。爲此本文涉及的技術——基友網絡爬蟲的XSS漏洞檢測技術,在XSS漏洞進行動態檢測的時候使用黑盒測試。所謂的黑盒測試也就是不知道站點的源代碼,這樣就可以使用該技術檢測任意一種語言來構建的網站。

動態檢測攻擊可以用程序實現對XSS攻擊者的模擬:第一步,對檢測站點進行全局掃描,通過這樣的方式獲取該站內所有的合法鏈接以及用戶的注入點;第二步,用事先已經預備好的XSS攻擊代碼,代替用戶的輸入,自動填入這些注入點,進行模擬人爲提交;第三,通過該請求返回的HTTP響應來判斷第二步中的注入是否成功,從而得知該注入點是否存在XSS漏洞[5]

該檢測方法主要可以由以下兩個模塊組成:網絡爬蟲模塊和漏洞檢測模塊。其中爬蟲模塊分析Web站點,扒取鏈接;而漏洞檢測模塊主要是分析站點注入點是否存在XSS漏洞,主要形式爲從數據庫提取出數據,對每一個注入點進行測試,再將最後的測試結果保存在數據中,並記錄可能存在的哪些XSS漏洞。基本方案示意圖如圖4-1:


4‑1基本方案示意圖

可見整個基本方案中最核心的模塊是XSS漏洞檢測模塊,以下更具體地介紹XSS漏洞檢測模塊主要完成的3個工作。

 

      

4.1.1.         分析注入點

在使用瀏覽器瀏覽互聯網資源的時候,用戶與動態網站兩者交互的地方主要是在於網頁的表單之中。而表單的輸入主要是存在input標籤中,input標籤一般擁有3個屬性:name,value和type。在基本方案中,還是採取以正則表達式的形式來查找表單以及表單的這些參數,然後把這些信息記錄在本地的數據庫中。除了簡單的輸入之外,實際應用中還會存在網頁的鏈接,比如:<a href=”URL”>或者 <frame src =”URL”>中的鏈接。

 

4.1.2.         模擬XSS攻擊

擁有了以上這些注入點之後,需要做的就是程序模擬XSS攻擊,然後等待下一步的分析響應,從而判斷是否存在XSS漏洞。模擬XSS攻擊的具體過程爲:通過事先準備的XSS攻擊代碼注入注入點,構造完數據包後,向服務器發送。在這個過程中,由於存在的XSS攻擊有多種,對於一個URL會使用循環的方式,完成多種XSS攻擊的檢測,如果該URL存在XSS漏洞攻擊,那麼將該XSS漏洞類型保存在數據中,繼續檢測其他的XSS漏洞類型,直至所有XSS類型檢測完畢,則將該URL放入已檢測隊列。

 

4.1.3.         分析響應

在一般的發送請求時,都是使用HTTP的get請求或者post請求。當發送完請求之後,肯定會返回一個響應,分析這個響應即可以知道該URL是否存在XSS漏洞。爲此需要在分析相應的client端存儲衆多可能存在的XSS攻擊代碼樣例。該數據中存儲的XSS攻擊樣例應該包含得儘可能的全面,這樣可以使得測試集的有效性。那麼只需要判斷請求返回的響應是否存在與數據庫中一模一樣的子字符串,如果存在,則說明該URL存在XSS漏洞,如果不存在的,可以繼續下一操作。

 

4.2.  基本方案的缺陷

對於基本方案的功能是可以確定有效的,但是基本方案的效率卻不得不受到懷疑。

首先,由於每次對於注入點的查詢都是要查詢數據庫來判斷,而一旦數據庫中記錄的很多的話,對於持久化數據的讀寫時間開銷很大,可以採取內存的方式來存儲這些信息。

可見在檢測的時候,一旦數據庫中有N個XSS漏洞樣例的話,那麼對於一個請求的響應,程序需要將該響應與N條數據庫漏洞樣例進行對比,這樣的檢測時間花銷也是巨大的,應該設計更有效的算法將注入點進行最合適最可能的攻擊形式進行比較,而不是每種攻擊代碼都去進行比較。

 

4.3.  基本方案改進

針對4.2提到的基本方案缺陷,可以對基本方案進行一定程度的改進,從而使得本方案在準確性和處理速度都有大幅度的改進。

由於對於大型站點來說,處理速度是一個非常重要的參考點,而基本方案在處理速度上並沒有體現出優越性。所以我們可以在這方面做出改進,主要思路是使用多線程網絡爬蟲,以及棄用數據庫,使用動態生成XSS攻擊代碼的形式,減少模擬XSS攻擊的時間開銷。

   

4.3.1.         多線程的改進

基本方案的設計中,網路爬蟲是採用單線程的,分析完一個網頁之後才能分析下一個網頁。所以這樣的話時間開銷的是很大的,在第一個改進中,我們使用多線程技術,這樣就可以使得多個線程並行的工作,單線程中按照順序來一個一個取分析網頁的方式被多線程鎖取代,這樣的話會大大提高CPU的利用率[6]。具體程序框架如圖4-2 。


 

4‑2多線程示意圖

4.3.2.         自動生成代碼改進

由於在基本方案中,每一個URL的檢測都是要檢測完畢所有數據庫中儲存的所有XSS攻擊樣例,這樣的導致的時間開銷巨大。在該部分的改進中,放棄了使用了數據庫,而是採取了自動生成檢測代碼的方式來完成功能。

根據注入點上下文自動生成攻擊代碼的過程如下:

(1)對每一個出入點進行固定長度的攻擊字符串alert(””XSS)<br>進行提交。對提交後的響應進行檢測,若檢測中出現了相同的字符串,那麼可以發現服務器沒有對<進行過濾,這樣的話,也就排除了很多的XSS攻擊樣例,使得後續的測試樣例減少,大大減少時間開銷。

(2)其實在實際情況中,應該對於不同的注入點,進行不同的XSS漏洞測試,這樣纔會對於測試具有更強的針對性,也會對於程序檢測的時間開銷有很好的正面影響。比如說,可以把用戶的注入點簡單的分爲5類,也就是:文本域,評論域,文本區域,腳本標籤和其他類型。程序首先來判斷是那種類型的注入點,然後再根據不同的注入點類型和編碼情況生成不同的測試代碼進行提交。用這樣的方式使得代碼的提交更具有針對性,也有效的減少從數據庫提取數據的時間開銷。

改進後,漏洞檢測模塊的示意圖如圖:


4‑3漏洞檢測模塊改進示意圖

 

可見,在該模塊的改進中,核心是生成攻擊代碼。在實際應用中,生成攻擊主要包含兩個步驟:(1)選擇攻擊代碼類型;(2)生成攻擊代碼。

由圖4-3的示意圖可知,在生成攻擊代碼的前一步爲初始檢測,這裏的初始檢測其實是就是爲了選擇攻擊代碼的類型。該部分根據初始檢測後返回的響應頁面中的未知唉自動選擇攻擊代碼的類型。由於在實際的應用中,在表單中輸入的字符串可能出現在響應頁面的任何東方,所以,對於不同位置應該使用不同類型的攻擊代碼。這就將彌補使用數據庫後盲目的進行全部類型檢測的弊端,使得整個檢測的過程變得更有針對性,一方面也大大減少了程序運行的時間。

一旦當漏洞檢測模塊已經選擇了攻擊代碼類型,那麼緊接着就是要生成相應的攻擊代碼。生成XSS攻擊代碼的話,要滿足可以生成任意類型的攻擊代碼。

 

5.   總結

由於動態網頁技術的發展,對於網絡應用層的攻擊也變得越來越頻繁,XSS就是最爲常見的攻擊之一。而網絡爬蟲是採集互聯網資源最爲流行最爲有效的網絡程序,則必須要防止扒取網頁的安全性、可用性,因此在網絡爬蟲中進行XSS漏洞檢測是極其有意義的事情。

本文綜述了XSS攻擊的原理以及對於XSS防禦的方法。另外還對國內外典型的XSS攻擊以及防禦和檢測方法作了簡要的介紹,並着重介紹了基於網絡爬蟲的XSS漏洞檢測技術。在該技術支撐的系統中,網絡爬蟲採用了多線程技術以保證網絡爬蟲的效率,另外根據網頁注入點的的上下文來動態生成用於檢測XSS漏洞的攻擊代碼,從而做到棄用效率一般、後期維護困難的數據庫存儲,最終達到高校檢測XSS漏洞的目的。

 

 

 

 


參考文獻:

[1]網絡爬蟲. http://baike.baidu.com/view/19137.htm?fromId=284853

[2]王學鬆:搜索引擎開發。北京:人民郵電出版社,2008

[3].XSS FAQ:http://www.cgisecurity.com/xss-faq.html#xss

[4]PayPal遭到XSS攻擊 :http://news.netcraft.com/archieves/2006/06/16/paypal_security_flaw_allows_identity_theft.html

[5]沈壽忠,張玉清,基於爬蟲的XSS漏洞檢測工具設計與實現.計算機工程.2009.11

[6]曹忠,趙文靜.一種優化的網絡爬蟲的設計與實現.電腦知識與技術.2008.12

發佈了47 篇原創文章 · 獲贊 10 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章