浏览器urlencode策略差异导致XSS风险
Tags: xss vul browsers securityPosted in XSS VUL on 三月 11th, 2011 by evilcos –0 Comment Read 691 times
浏览器在处理用户发起请求时的urlencode策略存在差异,导致在某些场景中出现XSS漏洞。最近知道创宇的Web漏洞扫描器发现了多起这种类型的跨站,这些网站都是PHP类型的网站,包括一些国内知名的团购网站与游戏论坛。经过分析,导致这种浏览器差异性的XSS,除了与浏览器的urlencode策略差异有关,还与服务端代码的实现有关,这类安全风险不仅是PHP的特例,其他服务端语言环境也可能出现这类问题。
漏洞分析
参考分析:http://evilcos.me/blog/a/xss-of-browsers-differences-1/,简单的测试poc如下:
分析地址:http://www.0x37.com:8989/test.php?c=’”`<>!@$%^*(){}[]:;.,?~
发送请求时,抓包发现,浏览器们的urlencode默认行为:
FireFox
GET /test.php?c=%27%22%60%3C%3E!@$%^*(){}[]:;.,?~ HTTP/1.1
编码了'"`<>特殊字符
Chrome
GET /test.php?c=’%22`%3C%3E!@$%^*(){}[]:;.,?~ HTTP/1.1
只编码了"<>特殊字符
IE内核
GET /test.php?c=’”`<>!@$%^*(){}[]:;.,?~ HTTP/1.1
不做任何编码
如果服务端语言直接获取到这样urlencode的内容进行输出,则可能导致在IE场景中出现XSS,在Chrome场景中出现小范围的XSS,而Firefox安全(相对我下面的这个场景:),你知道的。)。以PHP为例:
浏览器urlencode差异导致XSS:<br />
http://www.0x37.com:8080/test.php?c='"`<>!@$%^*(){}[]:;.,?~
<br />
<?php
echo '<h3>$_SERVER["QUERY_STRING"]</h3>';
echo $_SERVER['QUERY_STRING'];
echo '<br />';
echo 'in <input> <input type="text" value="'.$_SERVER["QUERY_STRING"].'" /><br />';
//echo '<h3>$_GET["c"]</h3>';
//echo $_GET["c"];
//echo '<br />';
//echo 'in <input> <input type="text" value="'.$_GET["c"].'" /><br />';
?>
POC: http://www.0x37.com:8989/test.php?c="><script>alert(/xeye/)</script>
注:自己搭建PHP测试环境,www.0x37.com是我本地hosts:P
PHP中$_SERVER['QUERY_STRING']将获取到浏览器urlencode后的内容(在django中是request.get_full_path(),其他语言自己找了),而$_GET["c"]获取到的是urlencode之前的内容。从这个场景中来看FireFox是最安全的,可换个其他场景就不一定了,至少FireFox将'"`<>都编码了,如果后台处理逻辑有问题,就很可能绕过一些过滤器,而后又傻乎乎的urldecode,就出现问题了:P
漏洞影响
估计比较多。尤其是那些团购网(一个框架出来的?),这种差异让浏览器解决不太实现,程序员们注意避免就好:)