新辦法繞過xss過濾-讓xss來的更猛烈些吧

大家都知道,普遍的防御XSS攻擊的方法是在后臺對以下字符進行轉義:<、>、’、”,但是經過本人的研究發現,在一些特殊場景下,即使對以上字符進行了轉義,還是可以執行XSS攻擊的。

首先看一個JS的例子:

運行這段代碼,結果顯示如下:

看到這么熟悉的尖括號,大家會不會有一些興奮的感覺呢?JS代碼中并沒有出現尖括號,可是運行時卻輸出了尖括號!!!這意味著:可以通過u003c和u003e來代替<和>。可是該如何利用這個特性來構造XSS攻擊呢?繼續看一個例子:

運行上面代碼,結果顯示如下:

在沒有尖括號的情況下,成功實現了一個彈框的案例。

現在來設想一個更貼近實際開發情況的例子:
(1)這里我們用網絡安全攻防研究室網站首頁進行演示:http://www.szcgpp.com/ main.html,其代碼為:

(2)http://www.victim.com/getcontent返回的內容格式如下:

其中name的值是用戶的昵稱。

這個例子簡單模擬了異步拉取信息并進行顯示的情況。

現在假設用戶的昵稱為:

那么會是什么情況呢?
首先getcontent返回的昵稱應該是這樣的:

因為后臺輸出JSON格式數據時,一般都會在前面添加轉義符進行轉義。
接著main.html的callback函數應該是等價于執行下面的語句:

顯示的結果如下:

很遺憾,沒有彈出框。原因是原來的轉義序列u003c并沒有生效,被添加的轉義符轉義掉了。

不過這里假設返回昵稱時對進行了轉義,但實際情況下,有時輸出json格式數據時是沒有對進行轉義的,那樣就會觸發漏洞。

對于有對進行轉義的,這時就輪到我們強大的半字符出場了。對于半字符的問題,這里并不打算詳細講,說下結論:
對于gb2312編碼,” [0xc0] “是一個合法的編碼,顯示為:”繺”。
對于UTF-8編碼,在IE6下,上述組合也是一個合法的編碼。
其中[0xc0]表示一個十六進制的值。

現在修改昵稱為:

getcontent輸出:

由于半字符[0xc0]的存在,在解釋上述JS代碼時,等價于:

可見,轉義序列u003c終于又回來了,顯示結果如下:

上述昵稱中并沒有出現單雙引號,尖括號,所以如果后臺只是對單雙引號和尖括號進行轉義,那么是可以被繞過防御的。
總結:

(1)??利用場景:輸出內容在JS代碼里,并且被動態顯示出來(如使用innerHTML)。
(2)??測試方法:截獲請求包,修改參數為:

(3)??防御方法:后臺對半字符,反斜杠,單雙引號,尖括號進行處理。

編輯點評:關于xss繞過的方式有很多,不少程序員以及小黑都認為過濾了<、>、’、”,就真的安全的,實際來說,只要針對這些字符進行一定的轉義,就能成功繞過!

這只是其中一種更多的可以參考本站本文《XSS攻擊匯總

原文連接:http://zone.wooyun.org/content/1253

責任編輯:梧桐雨

本文圖片由本站測試生成,轉載請注明!

網絡安全攻防研究室(www.szcgpp.com)信息安全小組收集整理。