跨站脚本(Cross Site Scripting)攻击是指在远程WEB页面的HTML代码中插入恶意的JavaScript,VBScript,ActiveX,HTML,或Flash等脚本,窃取浏览此页面的用户的信息,改变用户的设置,破坏用户数据的攻击技术。跨站脚本攻击在多数情况下不会对服务器和WEB程序的运行造成影响,但对客户端的安全构成严重的威胁,这主要是由于服务器对用户提交的数据过滤不完整造成的。
简单漏洞
我们举个最简单的例子,在动网论坛中提交:
***.com.cn/newbbs/showerr.asp?Errcodes=&action=otherErr
便能弹出包含自己Cookie信息的对话框,
而提交:
***.com.cn/newbbs/showerr.asp?Errcodes=&action=otherErr
就能重定向到xxx.com。
由于在返回"Errcodes"变量的值给客户端时,脚本没有进行任何编码或过滤恶意代码,当用户访问嵌入恶意"Errcodes"变量数据链接时,会导致脚本代码在用户浏览器上执行,从而导致用户资料泄露等后果。比如下面的链接:
***.com.cn/newbbs/showerr.asp?Errcodes=&action=otherErr
xxx.asp用于收集后边跟的参数,而这里参数指定的是Document Cookie,也就是使用户的Cookie值提交到了xxx.asp中。
以上的例子说明了CSS漏洞的存在,况且还可能实现不同的攻击。例如在一个News.asp中调入以上链接的框架,便能使用户在不知觉间交出自己的Cookie。当然,跨站脚本从来就不仅局限于得到Cookie的一功能。只要HTML代码能做到的,跨站脚本执行漏洞基本都能做到。例如,在一个WEB论坛用户注册页面中有以下的内容:
1.gif 2.gif …… $face的值按照程序员的意图应仅设定在下拉菜单中供用户选择,但是事实上我们可以通过POST的方法直接指定$face的值骗过程序: "><"&data=...... 程序接到$face的值后未经过任何处理,便将它显示出来: " > 显然,返回的页面中将会带上了一个零宽度的页面,这样造成的后果是不言而喻的。 漏洞实例 大家最关心的大概要算这个问题了,下面列举的漏洞危害可能并不全面,但应该是比较典型的: 获取用户Cookie中的敏感数据。 屏蔽页面特定信息。 伪造页面信息。 拒绝服务攻击。 突破外网内网不同安全设置。 与其它漏洞结合,修改系统WEB设置,查看系统文件,执行系统命令等。 一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。 1.伪造页面 如图2是一个伪造页面信息的例子,原理很简单:由于没有过滤$msg的内容,可以通过提交"?msg=要显示的内容"来伪造页面。IE对GET的长度有限制,你可以自行创建一个表单再用POST的方法提交,如: 以上的代码运行后仅显示出一个普通的"查看"按钮,由于我们把"msg"的Input Type设置为"hidden",从而将POST的内容隐藏了起来。以后,当用户点击"查看"按钮时,将会看到如图2所示的的伪造页面。 图2 2.获取其他用户Cookie中的敏感数据 既然CSS漏洞主要是由于服务器对用户提交的数据过滤不完整造成的,那么利用方法关键是找到可以向服务器写入信息的脚本。下面以WDB论坛为例子说明。 在WDB论坛中,当用户访问Wdbread.php文件时,返回的页面左侧会显示出发贴者"级别"、"来自"等信息,而这些信息是有作者通过Profile.php文件设定的。Wdbread.php返回页面显示用户"来自"的地方有这样一段代码: 级别:侠客 来自: 门派:无门无派 经验值:49 点 …… 而Profile.php返回页面有以下的代码: 中国 安哥拉 澳大利亚 …… 如果我没有猜错的话,Wdbread.php的处理用户"来自"的PHP代码应该是这样的: echo " "; ?> 于是我把Profile.php返回的页面保存到本地,将其中的一个"userflag"值改为China.gif>html代码 图3 这时候再打开自已发过的帖,嵌入里面的代码便执行了(如图4所示)。 图4 提示:当WEB的脚本禁止从外部提交数据时,你可以用NC或者Achilles间接修改POST的数据。 3.修改WEB设置 笔者以DVBBS为例,登陆dvbbs/modifyadd.asp,再将该页面保存到本地,用记事本打开,修改表单中的:action="modifyadd.asp?action=updat"为: action=dvbbs/modifyadd.asp?action=updat,再将"method=post"一句改为"method=get",点击"更新"后得到类似以下的URL: %B8%FC+%D0%C2 修改当前的URL为: %B8%FC+%D0%C2 最后再把这个URL伪装一下让论坛的其他用户点击,或者将链接在一个Main.htm上设置成零宽度的框架: