认识跨站脚本攻击
CERT曾警告:如果服务器对客户的输入不进行有效验证,黑客就会输入一些恶意的HTML代码,当这些HTML代码输入是用于脚本程序时,黑客就能利用它来进行破坏,如插入一些图片或声音等,同时可以干扰客户正确浏览网页。去年十分流行的流氓软件,以及广告弹出窗口,使得无数用户对恶意软件开始有了基本认识。恶意的标签和脚本不是单纯的恶作剧,他们甚至可以窃取资料和破坏系统。攻击者可以利用脚本干扰或改变服务器数据的输入,同时也可以攻击客户系统。而且你要知道,在你一边使用服务器的时候,黑客的脚本程序也正在你服务器里安全的地方运行着。如果客户对你的服务器非常信认,同样他们也会信任那些恶意的SCRIPT代码。甚至这个代码是来自黑客的服务器的<CRIPT>或者<OBJECT>的形式。即使使用了防火墙也不能完全防止跨站脚本攻击,这是由于如果生成恶意SCRIPT代码的设备也使用了SSL,我们服务器的SSL是不能辨别出这些代码来的。如何防御呢?让我们来通过案例来分析。
跨站脚本攻击示例:
根据CERT的资料,动态输入大致有这几种形式:URL参数,表格元素,COOKISE以及数据请求。让我们来分析一下只有两个页面的测试站点。
第一页使用一张表格或COOKIE来获取用户名:
|
<%@ Language=VBScript %> <% If Request.Cookies("userName") <> "" Then Dim strRedirectUrl strRedirectUrl = "page2.asp?userName=" strRedirectUrl = strRedirectUrl & Response.Cookies("userName") Response.Redirect(strRedirectUrl) Else %> <HTML> <HEAD> <TITLE>MyNiceSite.com Home Page</TITLE> </HEAD> <BODY> <H2>MyNiceSite.com</H2> <FORM method="post" action="page2.asp"> Enter your MyNiceSite.com username: <INPUT type="text" name="userName"> <INPUT type="submit" name="submit" value="submit"> </FORM> </BODY> </HTML> <% End If %> |
第二页返回用户名以示欢迎:
| <%@ Language=VBScript %> <% Dim strUserName If Request.QueryString("userName")<> "" Then strUserName = Request.QueryString("userName") Else Response.Cookies("userName") = Request.Form("userName") strUserName = Request.Form("userName") End If %> <HTML> <HEAD></HEAD> <BODY> <H3 align="center">Hello: <%= strUserName %> </H3> </BODY> </HTML> |
当你正常常输入文字时,一切都很正常。如果你输入Script代码:
| <script>alert(Hello.;</script> |
JavaScript警告标签就会弹出来,在你下一次访问时,这个警示标签同样会出现。为什么会这样?这主要是因为这个Script代码在你第一次访问的时后就已经留在cookie中。这是一个简单的跨站攻击的范例。 如果你认为这是一个特殊情况,你也不妨到网上别的地方看看,亲自试一下。笔者曾测试过很多许多专业网站,其中有微软、电力系统等大型国有企业,或多或少都存在这样的跨站漏洞,很难想象如此大型的机构都存在众多的过滤疏漏,那其他小网站就更危机重重。
用E-Mail进行跨站脚本攻击
在列表服务器或邮件服务器中进行跨站脚本攻击是十分容易的。由于你经常浏览某个网站,你就会对这个站点产生一定的忠诚度,因此在不知不觉中你就把浏览器的改成了总是信任这个动态网站内容的设置。有许多网站会提供注册数或广告点击来获得收入,于是很多用户会在电子邮件中鼓动用户尽快访问某个网站,甚至邮件中直接存有地址链接,假如这个链接的URL中的username参数中舔加script代码。有些客户就会在不知不觉中就点击这个链接,于是用户就会被欺骗,而邮件发送者会从中得到好处。那这是如何实现的?
当你点击这个链接的时后,在链接里的script代码就会引导你所用浏览器去下载指定的JavaScript程序并执行它。攻击者的Script检查到你使用的是IE浏览器后,就着手下载ActiceX控件。由于你对一个网站可能已经产生了忠诚的认可,所以攻击者的script代码和Active控件就能在你机器上不受限制的运行。
ActiveX攻击说明
W3C在《安全常见问题解答》中对ActiveX的安全问题作了比较详尽的说明。Java applet对系统的控制受到严格限制。SUN开发它时就规定,只有那些对系统的安全不构成威胁的操作才被允许运行。在另一方面,ActiveX对系统的操作就没有严格地被限制。如果一但被下载,就可以象安装的可执行程序一样运行。针对这一特点IE浏览器也作了某些限制,如对于那些不安全的站点,在它的默认设置中就会不允许你进行下载或者会给你警告的提示。正在基于ActiveX进行开发的公司,如VeriSign公司,它们对ActiveX控件都给编了号。当你在下载控件时,IE浏览器会给你警告并显示它的可信籁程度,由用户决定是否相信这个控件。但是,不得不承认存在很多并不完全了解计算机使用的用户,由于他们很难分辨哪一个插件到底是做什么的,所以往往会直接默认许可。假如用户长期浏览一个站点,如某某门户网站,很多用户会把其设置为默认,由于你对该站点的信任,在出现可用ActiveX控件下载的时候,绝大多数用户会无所顾及的下载并运行。
十六进制编码的ActiveX Script 攻击
假如一个用户,即使是一个很有经验的用户,要区分恶意标签和脚本都是一件非常困难的事,Script脚本能够以十六进制的形式把自己藏起来。例如一封看似完整的邮件,里面包含了以十六进制伪造的URL参数:sender=xxx.com。当用户点击链接时,用户的浏览器就会直接弹出警告窗口。
讲了三种攻击形式,我们是不是应该来看看如何防御了?
跨站Script攻击的防犯
如何避免服务器受到跨站脚本攻击
虽然跨站脚本攻击、社会工程学等一直很热,但防止跨站脚本攻击的技术正趋于完善。目前可采取这几种方式来防止跨站脚本的攻击:
1.对动态生成的页面的字符进行编码;
2.对输入进行过滤和限制;
3.使用HTML和URL编码。
对动态生成的页面的字符进行编码
所谓对动态生成的页面的字符进行编码,其实是为了防止黑客更改你的字符设置而轻易地通过你的防线。如果我们的网站是个英语网站,这样只要我们把字符编码设成拉丁字符ISO-8859-1就行了,具体情况如下:
| <META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"> |
过滤和限制所有输入的数据
当用户在进行登录的时侯,不要让那些特殊的字符也输入进去。因此我们可在ONSUBMIT方法中加入JAVASCRIPT程序来完成这个功能。例如,我们限制最多只能输入15个字符,这样可以阻止那些较长的script的输入。 微软提供了一个简短的Javascript程序来完成对输入数据的过滤。结合上面的实例,我们来看如下代码:
| function checkForm() { document.forms[0].userName.value = _ RemoveBad(document.forms[0].userName.value); return true; } // MICROSOFTS CODE function RemoveBad(strTemp) { strTemp = strTemp.replace(////"////%//;//(//)//&//+//-/g,""); return strTemp; } |
用这个办法,可以过滤在输入中含有 % < > [ ] { } ; & + - " ( ) 的这些字符。
您现在的位置: 
