您的位置:首页 > 运维架构 > 网站架构

网站安全之XSS漏洞攻击以及防范措施

2013-04-13 22:18 736 查看
XSS漏洞是网站漏洞中最容易出现的一种,至少现在的各大网站中基本都存在,传闻只有gmail是唯一一个完全不存在的,或者说攻击者没找出漏洞的,也许是因为XSS漏洞看起来危害并不是那么的大吧,所以基本上没有得到过太大的重视,从而也就造成了这么多的网站存在着一些很简单就能发现的XSS漏洞,在这篇blog中以我这个网站安全的外行人的角度来侃侃XSS漏洞攻击以及防范的措施。

XSS漏洞的出现简单来说,就是让不支持富文本的区域支持了富文本的执行,例如blog的标题是不支持富文本的,但由于页面显示时没去做处理,导致了可以在标题中嵌入像文本加粗、变颜色等等的普通HTML,当然,攻击者也就可以嵌入恶意的javascript了,例如获取你在当前网站的cookie的javascript:document.cookie等等,另外一种就是支持富文本的区域没有去过滤一些恶意的javascript,例如blog的文章内容中内嵌获取cookie等恶意的javascript代码,这两类现象太多了,反倒是富文本的区域会好一些,例如多数论坛采用的UBB等等,而且对于富文本,大家都会比较重视,但反而是非富文本区域,很容易忽略其会产生XSS漏洞。

上面说的好像有些太抽象了,举个例子来说吧,例如blog的标题,假设在存到数据库的时候是直接将blog标题文本框中的内容存储,在显示的时候直接用$blog.title这样的方式去显示的话,那么只要在blog标题中输入<script>alert(document.cookie);</script>,然后保存,在显示的时候这段javascript就会被正常执行了,虽然这样的看似没有什么大的危害,但攻击者同样不会采取这么简单的方式,例如可以直接给你一段经过url编码的串,而其中就是利用网站的XSS漏洞将你的cookie信息发送至一个攻击性质的记录cookie的网站等,又或者完全可以利用网站的XSS漏洞埋上一段隐藏的img来嵌入这样而已的url,那么你的cookie就会不知不觉的被盗用,而偏偏现在大部分的网站都是借助cookie来代表用户的身份,这样,当攻击者拿到cookie之后,也就可以假冒你的身份大摇大摆的进入相应的网站了。

上面说的是比较典型的一种XSS漏洞产生的情况,另外一种比较典型的是domxss的情况,这种情况多数是攻击者利用直接闭合标签,从而执行恶意的javascript代码,例如页面中有个文本框,这个文本框的内容在提交后会被记录并继续显示在结果页面的文本框架中,假设第二个页面中文本框是这么写的:<inputtype=textvalue="$!prevPage.someText">,那么只要在前一页面中输入"><script>alert(document.cookie);</script>这样的内容,在第二个页面显示的时候就会变成:<inputtype=textvalue=""><script>alert(document.cookie);</script>>,攻击者通过闭合input标签实现了执行恶意的javascript代码,同样,如果你的javascript中也有类似的读取url参数或前页提交的内容,又或数据库中的内容的话,攻击者都有可能利用这种闭合标签的方式来实施攻击。

这样看起来,产生XSS漏洞的地方确实可能会有很多,说完上面这些,大家估计仍然觉得xss漏洞即使被利用也没什么吧,确实,也许xss漏洞只能做到盗用个用户cookie来玩玩,但是一旦它盗用了cookie,然后再结合一些其他的攻击手段,例如csrf的话,很有可能会造成非常严重的后果,当年的MySpace攻击事件就源于此,更何况对于大部分的网站来说,用户身份被盗也不是什么好事。

因此还是有必要对XSS漏洞进行防范的,根据上面阐述的XSS漏洞产生的原因来说,对于非富文本的区域来讲,其实只需要对其进行HTML编码就没问题了,而对于富文本的区域,则相对麻烦一些,需要有一个有效的过滤攻击性质的html代码的方式,但这个确实很难很难完全做到100%的防范,因为编写恶意html代码的方式实在太多了,url编码方式,注释方式,十六进制方式等等,完全无法穷举,但目前出现在网站中的,其实大部分都是非富文本的XSS漏洞,只要对这些非富文本的XSS漏洞进行了防范的话,至少可以很大程度的提升网站攻击的门槛,不至于被一些很简单的攻击手段攻击,像freemarker模板中,可以直接支持变量字符的html编码,例如${user?html}这样的方式就可以了,还是很简单的。

一、跨站脚本漏洞出现的主要原因是服务器对用户输入的数据不做检查就直接输出

为了演示这个例子先把aspx页面的validateRequest=false,放一个文本框和一个按钮点击按钮式输出文本框的值

主要代码:string s = textBox.Text;Response.Write(s);

如果用户提交这样的信息:<script type="text/javascript">alert("您被抽为幸运用户,请到www.123.com领取奖品");</script>

服务器不作验证后就直接输出,当显示这段信息时会弹出上面的对话框。

二、在发帖、评论等模块也有这样的问题

解决方案一:

把页面的ValidateRequert=“true”或不设置,那凡是上面类似的内容则不能提交。

二:如果我是一个技术性的网站,允许出现代码,可以使用HttpUtility.HtmlEncode()将提交的内容得特殊字符转换,如<转成<等

对于上面的例子:context.Response.Write(HttpUtility.HtmlEncode(s));即可。

三:可以使用Literal控件,将Mode属性设为EnCode,那么,他会自动进行Decode并显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: