Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46643
  • 博文数量: 20
  • 博客积分: 890
  • 博客等级: 准尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 12:32
文章分类

全部博文(20)

文章存档

2009年(20)

我的朋友
最近访客

分类: 项目管理

2009-11-26 14:18:56

 如果服务器对客户的输入不进行有效验证,黑客就会输入一些恶意的HTML代码,当这些HTML代码输入是用于脚本程序时,黑客就能利用它来进行破坏……

  IT专家网独家】很多时候当人们谈到黑客,总会想到无所不能,潜入目标电脑,无所顾及的窃取和破坏数据。如今暴力破坏或炫耀技术已经不再是黑客最乐于尝试的活动,黑客,不应该准确的是网络犯罪分子更乐意去借助黑客技术,获取经济上的利益。例如,攻击访问网站的客户,记录用户信息,我们的服务器也成了他的帮凶。如今有一种攻击大多数都发生在网站动态产生网页的时侯,但黑客的目标并不是你的网站,而是浏览网站的客户,微软称这种攻击为跨站脚本攻击

  认识跨站脚本攻击

  CERT曾警告:如果服务器对客户的输入不进行有效验证,黑客就会输入一些恶意的HTML代码,当这些HTML代码输入是用于脚本程序时,黑客就能利用它来进行破坏,如插入一些图片或声音等,同时可以干扰客户正确浏览网页。去年十分流行的流氓软件,以及广告弹出窗口,使得无数用户对恶意软件开始有了基本认识。恶意的标签和脚本不是单纯的恶作剧,他们甚至可以窃取资料和破坏系统。攻击者可以利用脚本干扰或改变服务器数据的输入,同时也可以攻击客户系统。而且你要知道,在你一边使用服务器的时候,黑客的脚本程序也正在你服务器里安全的地方运行着。如果客户对你的服务器非常信认,同样他们也会信任那些恶意的SCRIPT代码。甚至这个代码是来自黑客的服务器的或者的形式。即使使用了防火墙也不能完全防止跨站脚本攻击,这是由于如果生成恶意SCRIPT代码的设备也使用了SSL,我们服务器的SSL是不能辨别出这些代码来的。如何防御呢?让我们来通过案例来分析。

  跨站脚本攻击示例:

  根据CERT的资料,动态输入大致有这几种形式:URL参数,表格元素,COOKISE以及数据请求。让我们来分析一下只有两个页面的测试站点。

      第一页使用一张表格或COOKIE来获取用户名:

 <%@ Language=VBScript %> <% If Request.Cookies("userName") <> "" Then Dim strRedirectUrl strRedirectUrl = "page2.?userName=" strRedirectUrl = strRedirectUrl & Response.Cookies("userName") Response.Redirect(strRedirectUrl) Else %>   MyNiceSite.com Home Page   

MyNiceSite.com

 "> Enter your MyNiceSite.com username:       <% 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 %>    Hello: <%= strUserName %>    


  当你正常常输入文字时,一切都很正常。如果你输入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.使用HTMLURL编码。

  对动态生成的页面的字符进行编码

  所谓对动态生成的页面的字符进行编码,其实是为了防止黑客更改你的字符设置而轻易地通过你的防线。如果我们的网站是个英语网站,这样只要我们把字符编码设成拉丁字符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; } 


      用这个办法,可以过滤在输入中含有 % < > [ ] { } ; & + - " ( ) 的这些字符。

  使用HTMLURL编码

  尽管使用过滤和限制输入的办法是一种非常重要用防御手段,但却不是万能的。针对某些特殊情况,如URL的参数直接放在邮件中,我们不得不采取一种更有力的安全措施。如我们用的ASP,解决起来相对容易些,只要对动态生成的页面进行HTMLURL编码就OK。针对我们例子中的情况,在第一输入页中我们对redirect URL作了如下改动:

strRedirectUrl = strRedirectUrl & _ server.URLEncode(Response.Cookies("userName"))


  在执行页中我们加入:

strUserName =server.HTMLEncode(Request.QueryString("userName")) 

strUserName =server.HTMLEncode(Request.Form("userName")) 


      微软推荐对所有动态页面的输入和输出都应进行编码,甚至在对数据库数据的存入和取出也应如此,这样可以在很大程度上避免跨站脚本攻击。

  要做到这些还要在Page1.asp中加入:

<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
redirect if detect the cookie Dim strRedirectUrl strRedirectUrl = "page2.?userName=" strRedirectUrl = strRedirectUrl & _ server.URLEncode(Request.Cookies("userName")) Response.Redirect(strRedirectUrl)
Else %>    MyNiceSite.com Home Page      
 

MyNiceSite.com

 
 " onsubmit="return checkForm();"> Enter your MyNiceSite.com username:      <% end if %>


  Page2.asp中加入如:

<%@ Language=VBScript %> <% Dim strUserName If Request.QueryString("userName")<>"" Then strUserName =server.HTMLEncode(Request.QueryString("userName")) Else Response.Cookies("userName") =Request.Form("userName") strUserName = server.HTMLEncode(Request.Form("userName")) End If %>      Hello: <%= strUserName %>  


      现在由于这种攻击受到有效的防制,恶意的标签和脚本被编码,他们就被以文字的形式显现了出来。我们也可增加一个IIS组件用于过滤所有从动态输入中的特殊字符。对于那些已经做好的网站,采用这种办法来防止跨站脚本攻击很容易实现。我们的这个控件能拦截来自ASP页面的REQUEST目标,可对表格、cookie、请求字符串和程序的内容进行检测。我们也可以通过编写log文件的方法把统计数据加入这个组件中。每当一个客户输入一个非法字符时,这个组件会记下它的IP地址和时间。我们只需采取一些简单的设置就能有效地阻止跨站脚本的攻击。除了以上所说的三种方法外,微软和CERT还强烈推荐使用一种他们称之为sanity check的方法。假设有个输入窗口只允许输入数字,我们就限定它只允许0-9数字的输入。微软和CERT所采用的这种对输入的字符进行限定的办法要比单独的采用过滤特殊字符要好得多,采用了这些措施后你就能让那些参观你网站的客户在访问你网站时受到保护。

  如何免受黑客攻击浏览器

  当你在网上冲浪时,怎样来避免受到攻击呢?在我们所举的例子中,即使用户注意了自己的浏览习惯,也不能完全避免在网上遭到黑客的袭击。具有讽刺的是,大多数的危险都来自于我们最信任的网站。如果要让网站一定不出问题,你只好不下载任何动态内容或者任何cookie。微软也警告用户应把浏览器的Active Script设置成严格限制的状态并把Email也设成严格限制的接收模式。同时在点击邮件中的链接时,一定要加倍小心。

  结论

  无论我们是从事何种工作,安全问题只会变得越来越复杂化,我们必须提高安全防范意识。在CERT公司的一篇报告中曾提到:跟据目前的研究显示,每个在英特网上具有域名的网站平均一年被黑客至少攻击一次。” 对服务器来说那怕只是一次这种攻击也是不能承受的。跨站脚本攻击有人并不认识他是一种攻击手段,有人仅仅认为这是玩笑,但是谁也不能忽视其隐藏的威胁。随着网络钓鱼行为的更加频繁,随着黑客相关知识更容易获取,每一个从事安全开发的人都必须提高警惕

阅读(634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~