跨站脚本执行漏洞详解与防护

  本文主要介绍跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧,解决方法和常见问题 (FAQ),由于目前介绍跨站脚本执行漏洞的资料还不是很多,而且一般也不是很详细,所以希望本文能够 比较详细的介绍该漏洞。由于时间仓促,水平有限,本文可能有不少错误,希望大家不吝赐教。

  声明,请不要利用本文介绍的任何内容,代码或方法进行破坏,否则一切后果自负!

  【漏洞成因】

  原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换。

  【漏洞形式】

  这里所说的形式,实际上是指CGI输入的形式,主要分为两种:

  1.显示输入

  2.隐式输入

  其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通 过输入数据来进行干涉。

  显示输入又可以分为两种:

  1. 输入完成立刻输出结果

  2. 输入完成先存储在文本文件或数据库中,然后再输出结果

  注意:后者可能会让你的网站面目全非!:(

  而隐式输入除了一些正常的情况外,还可以利用服务器或CGI程序处理错误信息的方式来实施。

  【漏洞危害】

  大家最关心的大概就要算这个问题了,下面列举的可能并不全面,也不系统,但是我想应该是比较典 型的吧。

  1. 获取其他用户Cookie中的敏感数据

  2. 屏蔽页面特定信息

  3. 伪造页面信息

  4. 拒绝服务攻击

  5. 突破外网内网不同安全设置

  6. 与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等

  7. 其它

  一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的 网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。

  【利用方式】

  下面我们将通过具体例子来演示上面的各种危害,这样应该更能说明问题,而且更易于理解。为了条 理更清晰一些,我们将针对每种危害做一个实验。

  为了做好这些实验,我们需要一个抓包软件,我使用的是Iris,当然你可以选择其它的软件,比如 NetXray什么的。至于具体的使用方法,请参考相关帮助或手册。

  另外,需要明白的一点就是:只要服务器返回用户提交的信息,就可能存在跨站脚本执行漏洞。

  好的,一切就绪,我们开始做实验!:)

  实验一:获取其他用户Cookie中的敏感信息

  我们以国内著名的同学录站点5460.net为例来说明一下,请按照下面的步骤进行:

  1. 进入首页http://www.5460.net/

  2. 输入用户名“

”,提交,发现服务器返回信息中包含了用户提交的“

”。

  3. 分析抓包数据,得到实际请求:

  http://www.5460.net/txl/login/login.pl?username=

&passwd=&ok.x=28&ok.y=6

  4. 构造一个提交,目标是能够显示用户Cookie信息:

  http://www.5460.net/txl/login/login.pl?username=之类的攻击没有什么问题,但是有时 CGI程序对用户的输入进行了一些处理,比如说包含在''或””之内,这时我们就需要使用一些小技巧 来绕过这些限制。

  如果你对HTML语言比较熟悉的话,绕过这些限制应该不成问题。

  【解决方法】

  要避免受到跨站脚本执行漏洞的攻击,需要程序员和用户两方面共同努力:

  程序员:

  1. 过滤或转换用户提交数据中的HTML代码

  2. 限制用户提交数据的长度

  用户:

  1. 不要轻易访问别人给你的链接

  2. 禁止浏览器运行JavaScript和ActiveX代码

  附:常见浏览器修改设置的位置为:

  Internet Explorer:

  工具->Internet选项->安全->Internet->自定义级别

  工具->Internet选项->安全->Intranet->自定义级别

  Opera:

  文件->快速参数->允许使用Java

  文件->快速参数->允许使用插件

  文件->快速参数->允许使用JavaScript

  【常见问题】

  Q:跨站脚本执行漏洞在哪里存在?

  A:只要是CGI程序,只要允许用户输入,就可能存在跨站脚本执行漏洞。

  Q:跨站脚本执行漏洞是不是只能偷别人的Cookie?

  A:当然不是!HTML代码能做的,跨站脚本执行漏洞基本都能做。