Web十大安全隐患之XSS跨站脚本

2015-07-06 16:20:00
Besttest
原创
5193
摘要:Web十大安全隐患之XSS跨站脚本

上次提到的是sql注入,算是较大的安全隐患,今天我们来介绍另外一种较为严重的安全隐患--XSS跨站脚本 攻击。
       
       首先咱们来说什么是跨站脚本攻击。它的英文叫“CrossSite Scripting”,通俗点说就是攻击者向web页面里跨站的插入恶意html代码,那么当用户浏览该页的时候,嵌入到web中的html代码就会被执行。我们经常看到的重定向啊,以及一些钓鱼网站,大多数利用的就是这种技术。比如有个广告,里边网址是item.taobao.com/.xxxx的,是某个人在某论坛发的广告链接,你觉得东西很便宜啊,又是淘宝的,有保障,就点击进去了。其实呢,它会redirect到另一个攻击者自己的网站,你在上面通过他的接口付款时候,就会不小心被他洗劫一空。

       介绍过了,其实老实讲,我自己对怎么攻击和攻击的原理也不是特别特别了解(大多数时候我们只要知道怎么测试出来有这个隐患和怎么防止就ok了)。不过大致原理咱们还是要了解的,后面是我节选自百度空间一篇文章,具体作者和链接我都忘记了。。是很久之前存下的,在这先感谢下。大家可以简单了解下其原理。

传统的跨站利用方式一般都是攻击者先构造一个跨站网页,然后在另一空间里放一个收集cookie的页面,接着结合其它技术让用户打开跨站页面以盗取用户的cookie,以便进一步的攻击。这种方式太过于落后,对于弊端大家可能都知道,因为即便你收集到了cookie你也未必能进一步渗透进去,多数的cookie里面的密码都是经过加密的,如果想要cookie欺骗的话,同样也要受到其它的条件的限约。而另一种思路,则从一定程度上解决上述的问题。比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。下面将详细的介绍这种技术。

 

寻找跨站漏洞
如果有代码的话比较好办,我们主要看代码里对用户输入的地方和变量有没有做长度和对”<”,”>”,”;”,”’”等字符是否做过滤。还有要注意的是对于标签的闭合,像测试QQ群跨站漏洞的时候,你在标题处输入<script>alert(‘test’)</script>,代码是不会被执行的,因为在源代码里,有其它的标签未闭合,如少了一个</script>,这个时候,你只要闭合一个</script>,代码就会执行,如:你在标题处输入</script><script>alert(‘test’)</script>,这样就可以弹出一个test的框。

 

如何利用
跨站脚本(Cross-site scripting,XSS)漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。

 

这个利用XSS漏洞的蠕虫病毒的特别之处在于它能够自我传播。myspace.com上的一个用户希望自己能够在网站的友人列表上更“受欢迎”。但是该用户不是通过普通的方法来结交新朋友,而是在自己的个人信息中添加了一些代码,导致其他人在访问他的页面时,会不知不觉地利用XSS漏洞将他加为好友。更恶劣的是,它会修改这些人的个人信息,使其他人在访问这些被感染的个人信息时,也会被感染。由于这种呈指数传播的方式,这种病毒才很快就被发现。

 

很难预防站点中的XSS。因此一定要认真检查您的应用程序是否存在XSS漏洞。此外,WebLogic Server的encodeXSS()也可以有所帮助。可以试着针对所有牵涉到使用encodeXSS()或其他某个筛选方法的输出找出一种编码模式——找出对一种编码模式来说不正确的应用程序往往要比找出XSS漏洞要容易的多。更重要的是,不要认为,就因为XSS漏洞是一个常见问题,所以它危害不大。

 

之所以出现XSS漏洞有两个原因。首先,HTML没有明确区分代码和数据。无法确定指出“这个字符串表示的是数据”。您可以将其放入引号中,但是数据是否包含引号呢?……其次,程序在将用户数据发送回浏览器时没有进行有效的转义。这导致包含有(例如说)引号的数据被放入页面中,从而引发了问题。而AJAX要提供的好处是,它包含一个专用渠道XML链接,其中全是数据而没有代码。这样,就有可能让客户端AJAX引擎负责对字符串进行转义、检测不正确的值,等等。说是这么说,直到AJAX更为成熟(可能也更为标准化)之前,它只会导致错误的编程和安全漏洞。

 

XSS漏洞可能造成的后果包括窃取用户会话,窃取敏感信息,重写Web页面,重定向用户到钓鱼网站等,尤为严重的是,XSS漏洞可能使得攻击者能够安装XSS代理,从而攻击者能够观察到该网站上所有用户的行为,并能操控用户访问其他的恶意网站。

 

对于XSS漏洞,我们有两种常见的措施,第一种就是消除漏洞,简而言之就是在输出页面上不提供任何用户的输入信息;另外一种就是想办法来抵御这种漏洞,可以采用对所有用户的输入编码后再输出(可以用OWASP的ESAPI),也可以对所有用户输入进行“白名单”验证,另外,OWASP还提供了AntiSamy对HTML页面做优化以消除这个漏洞。



       上面这段既包含了原理,也说了防止手段。算是我看过文章里比较全面的。那后边我们进入最重点部分,那就是怎么去测试XSS跨站脚本攻击。

       大致上可以把XSS攻击分成三类,Stored XSS、Reflected XSS、Dom-Base XSS。我们逐一介绍下。

       首先是Stored XSS,就是存储式跨站攻击。这是最为厉害的一种攻击方式,也是测试起来相对容易的。存储式跨站攻击简单来说就是攻击者提交给网站的数据呢会提交并永久保存到服务器的数据库或者是文件系统等其他地方,之后不做任何编码操作就会显示在web页面上。貌似说的不是很清楚,我们可以举个例子来说:

       比如说一个社交网站或其他可以给在网站中留言的地方,事实上呢,我们在可以留言的地方写入一段代码:

  1. <script>alert(document.cookie)</script>
复制代码

这样这个信息就被存储到了服务器上,当有其他用户访问这个网页时候,其浏览器就会执行这个脚本,从而弹出一个关于cookie的alert。类似下图所示。

我们就完成一次最简单的存储式跨站攻击。到目前为止最典型的存储式跨站攻击的例子就是05年myspace发现的漏洞,具体情况大家自行google~~~

       其次Reflected XSS,反射跨站脚本攻击。这个是最著名最常见的攻击手段。所谓反射,就是等着服务器所给的返回。我们在进行测试行依据的就是在自己页面上的简单注入。在web客户端提交了数据后,服务端马上给这个请求生成返回结果页,如果结果中包含了未验证的客户端输入数据,那就表示会允许客户端脚本直接注入到页面里,也就出现了这样一个漏洞。简单举个例子,在搜索引擎里边,我们如果搜索了一个包含html代码的字符串,如果返回的字符串仍然没被编码,那就是存在XSS漏洞了。呃,我自己说的也比较晕,不知道大家能理解没有。

       这个漏洞乍听上去比较不严重,反正觉得只能在自己页面上注入代码嘛,但是其实只要有一些工程学方法,攻击者就可以诱使其他用户访问一个在结果中注入了代码的url,使攻击者拥有整个页面的权限。(具体的工程学方法。。我也不会,要是我会估计我就不在这里敲字了哈)



       刚才说了三类,最后一类就是基于DOM的XSS攻击。由于我是做web测试的,这类相对见的比较少,该漏洞多见于客户端脚本,意思就是如果一个js访问需要参数的url,并且需要把信息用于自己页面,信息又未被编码,就会出现该漏洞。是不是太抽象了?好吧,我简化一下,我们是不是经常看到一个网站(比如我们论坛)在网址后边带个参数(?XXX的),当看到这种情况时候,我们可以在参数后边加点料,加个<script></script>的,如果加了这个参数之后的结果不被编码就输出,那就证明它具有这么一个漏洞。

      举个例子吧,比如某某网站,我们输入一个这样的url去请求:

  1. http://server.com/XXX.php?<SCRIPT>alert(“Cookie”+document.cookie)</SCRIPT>
复制代码

如果这个脚本被执行了,那么我们就说他有这样一个漏洞

    公司简介
    Besttest,全称北京百测技术咨询有限公司,是目前中国唯一一家专业高端软件培训机构,长年致力于测试领域在职短期提升、企业内训、技术推广、免费公开课等多种服务方式,持续为软件测试工程师提供优秀的学习平台。