老话重提:防范跨站脚本攻击
2013-01-22
不久前,Web安全咨询师George Deglin发现了一段成功实施了攻击的跨站脚本(XSS)代码,这段代码利用了Facebook颇有争议的即时个性化功能。该代码在Facebook所选中的测试即时个性化的3个网站之一——Yelp上运行。运行该代码段,Deglin不仅获得了与Yelp共享的Facebook上的个人档案信息,而且还截获了发送档案给Facebook好友的邮箱地址,这无论对于市场销售人员还是垃圾邮件发送者来说都是一座潜在的金矿。
就在Deglin发现的XSS漏洞被修补上之后没多久,另一个XSS漏洞又在Yelp上出现,搞得Facebook只好将该网站的即时个性化程序暂时挂起来。
XSS攻击并不新鲜,但是随着社交媒体的兴起,又给了此类攻击一片新的用武之地。
XSS简单入门
最常见的XSS攻击方法就是利用邮件:犯罪分子在一个普通的URL网址中添加一些特殊字符,例如添加几个外文字符。这些字符会适时地告知运行事先制作好的脚本的 Web服务器,举例来说,一个攻击者给你的网上银行的网址中添加了这样一个脚本,然后发邮件给你。假如你相信这是来自你的网上银行的合法邮件,然后点击了邮件提供的链接地址,那么你的浏览器就会给那台Web服务器发送该脚本,这台服务器上所运行的恶意代码就会截获你的浏览器cookies和你的银行登录信息,转发给攻击者,后者便可登录进你的网上银行账号。
另一类XSS攻击会将恶意代码存放在一台Web服务器上。攻击者登录比如说一家电子商务网站,然后发送一条含有XSS跨站脚本的消息。数天之后,如果你登录了这家电子商务网站,阅读了这条不良消息,就会和前一类一样,该脚本盗取你的cookies和登录信息,并将其转发给犯罪分子,而他便可以冒充你了。
第三类XSS攻击是针对Web浏览器的。在这种情形中,攻击者会在你所访问的网站上放置一个带毒的Flash文件。当你的浏览器下载这段Flash视频的时候,该文件便会触发一个跨站脚本,攻击者便可掌控你的浏览器所浏览过的页面元素。
Web 2.0和XSS
今天的很多网站在过滤常见的XSS供给方面都要比过去做得好。假设你点击了A网站上的一个广告。但是你不知道的是,该广告含有一个跨站脚本,可以悄悄地将你的浏览器定向到B网站,比如一家旅游网站和社交网站彼此合作,那么前者便可通过你的点击而轻松获得你的社交网络档案。利用XSS攻击,你就成了一个牺牲品,你甚至不必去访问B网站,登录B网站,点击它上面的任何东西,你甚至可能都不知道B网站的存在。由于B网站已经截获了你的社交网络档案(可能还有你的好友们的档案),于是犯罪分子便可以躲藏在A网站的广告后面,大摇大摆地截获你的信息了。这就是Web 2.0的聚合功能带来的麻烦,也就是Facebook-Yelp的合作为什么会出现XSS攻击的原因。
自我保护
遗憾的是,网站还无法通过连接加密简单地防范XSS攻击。有SSL连接的网站,也就是你在浏览一个加密网站时在工具栏上会出现一个小挂锁的网站,也只不过是对攻击进行了加密而已。一般来说,网站设计人员必须锁定他们的网站才能防止XSS攻击。
不过用户也有两种方法可避免XSS攻击。其一是忽略一个网站到另一个网站的链接:比如说,如果A网站链接到somerandomsite.com/page,那么你如果先要上这个网站,最好不要去直接点击该链接,而是通过搜索功能去查找该网站。这种方法可有效防止嵌入在链接网址中的XSS攻击,但是这种方法用起来不太方便,而且当两个网站共享内容时就没办法用了。另外一种方法是在你的浏览器中禁用像JavaScript脚本语言。即便因此可能会让一些网站上的一些很不错的功能没法使用,只要你还能够容忍就行。
禁止危险脚本
IE8是第一款内置了XSS脚本拦截保护的浏览器。谷歌的Chrome也会紧随其后推出类似功能。这两款浏览器都会首先查看来自某个Web服务器的脚本是否是恶意的——如果是,就拦截它。在之前的黑帽欧洲2010大会上,研究专家David Lindsay和Eduardo Vela Nava却演示了一种可以破除这种拦截的办法,不过谷歌已经修复了Chrome中的这个漏洞。微软则在第2年1月(发布补丁 MS10-002)和 3月(发布MS10-018)也已解决了大部分问题,并计划在6月修复第3个漏洞,所以在你读到这篇文章的时候,破除XSS脚本拦截的问题可能已经完全解决了。
Firefox的用户则可以利用免费的NoScrpit附加组件有选择地拦截脚本。比如说,你可以放行一段Flash视频,而同时拦截该网站上的其他脚本组件。IE和Chrome在拦截可疑脚本方面没有这么细的粒度——它们是要么全拦截,要么全不拦截。
NoScrpit也有一个问题,那就是大多数用户并不喜欢放行个别脚本的做法,因为这样会带来不便。不过拦截和放行今后可能会成为你的第二天性。你还可以对某个特定网站上的所有脚本进行认证,无论是为了一次性访问还是今后的所有访问,这样的认证如今在IE 8和chrome中也可以做了。