一個搜索引擎中的反射XSS 預防和防禦跨站漏洞 Web安全展望

【前言】吼吼,期待的十一長假開始倒計時啦,兩天!

 

【原文】http://hi.baidu.com/ljw747691966/blog/item/918cecf1bd7181a6a50f5279.html

 

例子:一個搜索引擎中的反射XSS 搜索功能是Web站點的基本功能,在這些站點中,用戶可以輸入一個單詞或者一個短語來進行查找,然後就會返回一系列搜索結果,當沒有找到搜索項的時候,將會返回給用戶一條錯誤信息,如圖10-2所示。 圖10-2 當沒有找到搜索項的時候,返回的出錯信息 通過查看這個頁面的URL地址http://server/search.aspx?keyword=monkey,你可能已經想到了:在這個URL中鍵入的數據已經通過搜索結果的Web頁面返回了,你可以稍微修改一下這個URL來驗證你的想法,例如,當你輸入的URL爲http://server/seach.aspx? keyword=SomeBogusText時,你就會發現URL中的數據已經通過Web頁返回了,在這裏,URL中的數據是指查詢參數字符串“keyword”的值。通過查看HTML源代碼,可以更好地理解這個頁面是如何工作的。下述HTML源代碼就是通過search.aspx返回的:

Search Results

for SomeBogusText

Sorry, no results were found.

 

可以看到,在查詢字符串中輸入的數據被放置在HTML的區域中了,區域能夠包含HTML標記,這是多麼有趣的一個測試用例,如果查詢字符串中包含黑體的()標記會怎麼樣呢?你可以通過瀏覽一個類似於http://server/search.aspx?keyword= Boldly%20go%20where%20no%20dev%20expected的URL來測試該用例。Web服務器會返回如下的HTML,黑體字部分顯示了輸入的單詞Boldly:

Search Results

for Boldly go where no dev expected

Sorry, no results were found.


這是一個有趣的現象,但是,黑體部分的內容並不存在安全問題。然而,這個測試用例本身表明了HTML能夠通過Web服務器進行響應,並且瀏覽器能夠以HTML的方式顯示這些響應的數據。正如你將要看到的一樣,運行腳本會更加有趣。通過輸入URL地址http://server/search.aspx?keyword=

Sorry, no results were found.


現在,利用Web服務器搜索功能缺陷對它的迴應,腳本就能運行。接下來討論一下其重要性的原因,並討論當攻擊者在他們的站點上處理腳本的時候,那些響應的腳本爲什麼會不同。 圖10-3 當在查詢字符串中包括腳本的時候,Web站點上顯示的警告信息 預防和防禦跨站漏洞 dvHTMLEncode()函數是筆者從ubbcode中提取的用於處理特殊字符串的函數。它能把尖括號之類的字符替換成HTML特殊字符集中的字符。 HTML語言是標籤語言,所有的代碼用標籤括起纔有用,而所有標籤用尖括號括起。尖括號不能發揮原來的作用之後,攻擊者插入的代碼便失去作用。dvHTMLEncode()函數的完整代碼如下: function dvHTMLEncode(byval fString) if isnull(fString) or trim(fString)="" then dvHTMLEncode="" exit function end if fString = replace(fString, ">", ">") fString = replace(fString, "<", "<") fString = Replace(fString, CHR(32), " ") fString = Replace(fString, CHR(9), " ") fString = Replace(fString, CHR(34), """) fString = Replace(fString, CHR(39), "'") fString = Replace(fString, CHR(13), "") fString = Replace(fString, CHR(10) & CHR(10), "

 

") fString = Replace(fString, CHR(10), "
") dvHTMLEncode = fString end function 這個函數使用replace()函數替換字符串中的一些特殊字符,如果需要過濾其他特殊字符,可以試着添加。 用dvHTMLEncode()函數把所有輸入及輸出的字符串過濾處理一遍,即可杜絕大部分的跨站漏洞。 如簡單留言本的漏洞是因爲name中的body沒有經過過濾而直接輸出到頁面形成的,代碼如下: …… 如下修改代碼即可避免跨站漏洞: …… 用dvHTMLEncode()函數過濾後輸出,不會存在問題,也可以在用戶提交時過濾後寫到數據庫中。 爲禁用JavaScript,單擊IE中的“工具”|“Internet選項”|“安全”|“Internet”|“自定義級別”選項,找到“腳本”部分,把“活動腳本”設置成“禁用”狀態。 另外儘量不要訪問安全性不高的網站,上網時打開殺毒軟件的腳本監控功能,這樣可以避免被惡意攻擊者利用跨站腳本漏洞攻擊的可能性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章