大家都知道,普遍的防禦xss攻擊的方法是在後台對以下字元進行轉義:、』、」,但是經過本人的研究發現,在一些特殊場景下,即使對以上字元進行了轉義,還是可以執行xss攻擊的。
首先看乙個js的例子:
default
vars="u003cu003e";
alert(s);
執行這段**,結果顯示如下:
看到這麼熟悉的尖括號,大家會不會有一些興奮的感覺呢?js**中並沒有出現尖括號,可是執行時卻輸出了尖括號!!!這意味著:可以通過u003c和u003e來代替。可是該如何利用這個特性來構造xss攻擊呢?繼續看乙個例子:
default
test
vars="u003cimg src=1 οnerrοr=alert(/xss/)u003e";
document.getelementbyid('s').innerhtml=s;
執行上面**,結果顯示如下:
在沒有尖括號的情況下,成功實現了乙個彈框的案例。
現在來設想乙個更貼近實際開發情況的例子:
default
aa functioncallback(obj)
document.getelementbyid("test").innerhtml=obj.name;
(2)返回的內容格式如下:
default
callback();
其中name的值是使用者的暱稱。
這個例子簡單模擬了非同步拉取資訊並進行顯示的情況。
現在假設使用者的暱稱為:
default
u003cimg src=1οnerrοr=alert(/xss/)u003e
那麼會是什麼情況呢?
首先getcontent返回的暱稱應該是這樣的:
default
\u003cimg src=1οnerrοr=alert(/xss/)\u003e
因為後台輸出json格式資料時,一般都會在前面新增轉義符進行轉義。
接著main.html的callback函式應該是等價於執行下面的語句:
default
document.getelementbyid("test").innerhtml=" \u003cimg src=1 οnerrοr=alert(/xss/)\u003e";
顯示的結果如下:
很遺憾,沒有彈出框。原因是原來的轉義序列u003c並沒有生效,被新增的轉義符轉義掉了。
不過這裡假設返回暱稱時對進行了轉義,但實際情況下,有時輸出json格式資料時是沒有對進行轉義的,那樣就會觸發漏洞。
對於有對進行轉義的,這時就輪到我們強大的半字元出場了。對於半字元的問題,這裡並不打算詳細講,說下結論:
對於gb2312編碼,」 [0xc0] 「是乙個合法的編碼,顯示為:」繺」。
對於utf-8編碼,在ie6下,上述組合也是乙個合法的編碼。
其中[0xc0]表示乙個十六進製制的值。
現在修改暱稱為:
default
[0xc0]u003cimg src=1οnerrοr=alert(/xss/)[0xc0]u003e
getcontent輸出:
default
callback();
由於半字元[0xc0]的存在,在解釋上述js**時,等價於:
default
callback();
可見,轉義序列u003c終於又回來了,顯示結果如下:
上述暱稱中並沒有出現單雙引號,尖括號,所以如果後台只是對單雙引號和尖括號進行轉義,那麼是可以被繞過防禦的。
總結:(1) 利用場景:輸出內容在js**裡,並且被動態顯示出來(如使用innerhtml)。
(2) 測試方法:截獲請求包,修改引數為:
default
%c0u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0u003e
(3) 防禦方法:後台對半字元,反斜槓,單雙引號,尖括號進行處理。
編輯點評:關於xss繞過的方式有很多,不少程式設計師以及小黑都認為過濾了、』、」,就真的安全的,實際來說,只要針對這些字元進行一定的轉義,就能成功繞過!
include尖括號和
都是合法的。二者的區別是 用尖括號 時,系統到系統目錄中尋找要包含的檔案,如果找不到,編譯系統就給出出錯資訊。有時被包含的檔案不一定在系統目錄中,這時應該用雙引號 形式,在 中指出檔案路徑和檔名。如果在 中沒有給出絕對路徑,如 include file2.c 則預設指使用者當前目錄中的檔案。系統先在...
Python小括號 中括號 大括號和尖括號的含義
在使用python做專案的過程中發現這種語言使用了很多種型別的括號來表達資料型別,常見的有四種,分別是 小括號 中括號 和大括號,也叫做花括號,還有尖括號 其作用也各不相同,分別用來代表不同的python基本內建資料型別。1 python中的小括號 代表tuple元組資料型別,元組是一種不可變序列。...
C include 尖括號和雙引號的區別
這兩種寫法都是正確的寫法,但是它們卻是有區別的。我們知道c 已經有一些編寫好的標頭檔案 比如標準函式庫等等 它們存放在vc 的include資料夾裡。當我們使用 include 檔名 命令時,編譯器就到這個資料夾裡去找對應的檔案。顯然,用這種寫法去包含乙個我們自己編寫的標頭檔案 不在那個includ...