小小的一段代码就真的能使一个站点成这样?好叫我们来具体的看看所谓的跨站脚本攻击到底会成为什么样的攻击模式.进入一个含UBB功能的站点,比如留言板,论坛,或是含提交程序的站点.首先,讲一下最简单的脚本攻击:
登陆过一个CGI制作站点.以原来ASP的眼光看CGI的站点,感觉CGI对脚本的过滤应该很好.于是做了最初的测试.在用户一栏中填写
简单的脚本攻击如
初级问题: [url ]的过滤,在提交该代码时可以构建一个onmouseover函数的恶意代码,既然onmouseover可以生效,那还有什么办不到的?一些原码程序在变换[url ][/url ]时,只是将[url ]s2[/ url]中的s2直接提交到< a href="s2" target=_blank>S2中.看到如此转换我们可以使用相应的ASCII 码中的& #34;来代替",我们多提交一个"然后在构建onmouseover函数进行操作,后果?你应该知道!:P
[img ]的过滤,这真的算是个老大难的问题.很早以前就是[img]的脚本攻击流行一时啊.这次测试中,很多站点还是仍然存在这个漏洞.有点程序根本没有进行过滤.尤其是一些免费留言板的提供站点很多都存在这样的问题.下面我们主要将一下[IMG ]标签的问题:
很简单的[img ] javascript:alert();[/ img]提交后转换成的代码为< img src=" javascript:alert();">,好,到这里我们就可以看到 javascript:alert();被< img src="">标签激活了.表现就是弹出对话框.上面写着你在()中要提交的东西.如documents.cookie 呵呵..大多数人都应该知道这东西是做什么.更有甚者,使用document.write();函数,可以写网页.写什么?当然是恶意代码,如[ img] javascript:document.write();[ /img].()中间加你要加的,写你要写的,想多危险就多危险.
高级问题: 由于[img ]的初级问题骚扰很多站点就对一个敏感的字符开始过滤.如ja连接,do连接,wr连接,提交后自动分为j a,d o,w r.或是对字符进行过滤java,document,等等.而这些只能难倒一小部分人.我们仍然可以利用ASCII码来代替.可能有人会对代替后的代码仍然不能正常显示而困惑.好,我们下面以一个完整的例子介绍:
某站点UBB过滤代码段如下:
<% Function code_ssstrers) dim strer:strer=strers if strer="" or isnull(strer) then code_ss"":exit function strer=replace(strer,"<","<") strer=replace(strer,">",">") strer=replace(strer," "," ") '空格 strer=replace(strer,CHR(9)," ") 'table strer=replace(strer,"'","'") '单引号 strer=replace(strer,"""",""") '双引号 dim re,re_v re_v="[^\(\)\;\';""\[]*" 're_v=".[^\[]*" Set re=new RegExp re.IgnoreCase =True re.Global=True re.Pattern="(javascript:)" strer=re.Replace(strer,"javascript:") re.Pattern="(javascript)" strer=re.Replace(strer,"javascript") re.Pattern="(jscript:)" strer=re.Replace(strer,"jscript :") re.Pattern="(js:)" strer=re.Replace(strer,"js:") re.Pattern="(value)" strer=re.Replace(strer,"value") re.Pattern="(about:)" strer=re.Replace(strer,"about:") re.Pattern="(file:)" strer=re.Replace(strer,"file&:") re.Pattern="(document.)" strer=re.Replace(strer,"document :") re.Pattern="(vbscript:)" strer=re.Replace(strer,"vbscript :") re.Pattern="(vbs:)" strer=re.Replace(strer,"vbs :") re.Pattern="(on(mouse|exit|error|click|key))" strer=re.Replace(strer,"on$2") |
能看懂ASP的朋友,就可以看出,以上代码段对javascript,jscript:,js:,about;value,document.,onmouse以及onexit等语句进行了过滤和替换.并对一些特殊字符进行了替换.如".",";""(",")" [替换代码为""中间的"..仔细观察代码后我们会发现其过滤机制并非想想象的那样完美.提交:[ mg]& #176& #93& #118& #97& #115& #79rip& #106& #57documen& #115& #76write& #30& #29哈哈又被黑了& #29& #61& #29[/ mg] 类似代码就可以实现更高级的脚本攻击.注:由于很多站点仍存在此问题,所以将代码修改过,无攻击性了.
打开你的FT2000,使用文本编辑,你可以找到任何特殊字符所属的ASCII码.如:分号;可以代替为 59,句点.可以代替为 46,以这样的形式我们再次提交代码.果然,上面整个的过滤机制几乎完全失效了.根本没起到什么防御作用.
看了以上的攻击方法,是不是觉得很郁闷?如果才能避免上面的问题发生?
1.如果你的站点程序含论坛,留言板,以及其他程序中含提交数据格式的,没有很好过滤机制,请马上下载升级程序或是停止使用.避免造成更多的问题.
2.各提供免费论坛,免费申请留言板的站,请将UBB格式关闭.或找到更好的解析UBB.ASP程序页.
3.对一些会编写ASP的朋友,我建议大家过滤一下字符:(全部字符将写在[]中)如:
["|.|;|:|\|/|&|$|#|`|)|,|'|"|-|~|[|(||] 注:其中|为分割符
4.对于某些站点建议去掉问题比较多的留言板,或是其他含提交的程序.如:原www.sangel.net使用的guestbook,一些不知名的程序体问题更是多多.建议换掉它.
5.我本人也修改了一个国外的留言板,前台基本已经修改完毕.后台这几天正在赶.修改后感觉在文本提交和输入以及留言时都有了很好的过滤.本来打算全采用英文界面,但考虑到N多chinese 对英语不过关,我还是将部分程序汉化了.有兴趣的朋友可以http://www.e3i5.com/guestbook/ 测试.我们欢迎善意的测试.
以下是国内一些经过本人测试的站点的留言板有问题的地址,(请各位站长注意啦,及时修补程序免得造成不必要的麻烦),测试的时间比较短一些,可能有一些站点没有找到.可能存在着更严重的问题.
以上就是这次脚本攻击测试的全部内容。综观全部站点,看上去安全性真是的不敢再想.问题多多.
虽然只是举手之劳就可以解决的问题,但稍不小心就会造成大问题