网络安全技术 再讨论跨站脚本攻击与防御

作者: 专题 2012-01-17

  网络上曾经有过关于跨站脚本攻击与防御的文章,但是随着攻击技术的进步,以前的关于跨站脚本攻击的看法与理论已经不能满足现在的攻击与防御的需要了,而且由于这种对于跨站脚本认识上的混乱,导致现在很多的程序包括现在的动网都存在着跨站脚本过滤不严的问题,希望本文能给写程序的与研究程序的带来一点思路。FBj红软基地

  还是首先看看跨站脚本漏洞的成因,所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码,数据流程如下:FBj红软基地

  恶意用户的Html输入————>web程序————>进入数据库————>web程序————>用户浏览器FBj红软基地

  这样我们就可以清楚的看到Html代码是如何进入受害者浏览器的了,我们也就可以根据这个流程来讨论跨站脚本的攻击与防御了!FBj红软基地

  1、什么是HTml输入?FBj红软基地

  这里给出一个HTml代码的示例FBj红软基地

  <img src="http://www.loveshell.jpg" width=100 onerror=alert("载入图片错误!")>FBj红软基地

  很多的程序最终都是将用户的输入转换成这种形式的。可以看到<>是告诉浏览器这是一个Html标记,img是这个Html标记的名称,src 是这个标记的第一个属性,=后面是这个属性的值,后面的width是第二个属性,onerror是标记的事件属性。大家可以看到,一个Html标记是包括很多元素的,并不是传统意义上的只有输入<>才会注入Html,事实上只要你的输入处在Html标签内,产生了新的元素或者属性,就实现了跨站脚本攻击!实际上大多数隐秘的跨站脚本攻击是不需要<>的,因为现在的Ubb标签已经让你处在了Html标记之内,很有意思,不是么?FBj红软基地

  2、哪里才是罪恶的来源?FBj红软基地

  既然我们的目标是引入代码在目标用户的浏览器内执行,那么我们来看看哪些地方可以引入HTml代码吧!如果用户可以不受限制的引入<>,那么很显然他可以完全操纵一个Html标记,譬如<script>alert('xss')</script>这样的形式,这对于追求安全的程序来说是绝对不允许的,所以首先要做转换的就是<>,通过如下代码:FBj红软基地

过滤代码:FBj红软基地
replace(str,"<","<")FBj红软基地
replace(str,">",">")FBj红软基地
好了,用户可能不能构造自己的HTml标记了,那么利用已经存在的属性如何呢?下面的代码依然可以工作得很好:
FBj红软基地

<img src="javascript:alert(/xss/)" width=100>FBj红软基地

  因为很多的Html标记里属性都支持javascript:[code]的形式,很好,很多的程序意识到了这一点,可能做了如下的转换:FBj红软基地

过滤代码FBj红软基地
Dim reFBj红软基地
Set re=new RegExpFBj红软基地
re.IgnoreCase =TrueFBj红软基地
re.Global=TrueFBj红软基地
re.Pattern="javascript:"FBj红软基地
Str = re.replace(Str,"javascript:")FBj红软基地
re.Pattern="jscript:"FBj红软基地
Str = re.replace(Str,"jscript:")FBj红软基地
re.Pattern="vbscript:"FBj红软基地
Str = re.replace(Str,"vbscript:")FBj红软基地
set re=nothing
FBj红软基地