分析跨站脚本攻击(XSS)的原理、防范和处理方法

分类:服务器| 发布:佚名| 查看: | 发表时间:2014/8/28
1。概念
 
以下概念摘抄自百度百科:
 
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
 
2。生效方式
 
1)构造URL
 
XSS攻击者通过构造URL的方式构造了一个有问题的页面;当其他人点击了此页面后,会发现页面出错,或者被暗中执行了某些js脚本,这时,攻击行为才真正生效。
 
一般来说,动态页面中会将url中的部分内容回写在页面中。以百度的搜索为例:
 
http://www.baidu.com/s?wd=<script>alert("wrong")<%2Fscript>
 
参数<script>alert("wrong")<%2Fscript>是<script>alert("wrong")</script>转义后的结果,搜索结果页中,会在标题中中和搜索框中回写用户输入的内容。从页面的源代码中,我们看到,这两处本应该显示用户输入内容<script>alert("wrong")</script>的地方,实际也经过了转义处理,变成了<script>alert("wrong")</script>。如果这里没有经过转义处理,则页面中就嵌入了一段script,会执行,并弹出对话框提示用户。如果是其他恶意代码,则可能造成破坏。
 
然后攻击者将此URL广为传播——比如说,以报错的方式发给百度的管理员,管理员打开这个URL就中招了。
 
2)发布内容式
 
构造URL攻击方式传播范围有限,被攻击者只要有基本的安全意识就可以避免,因此这种手段的危险性比较小。相比之下,通过发表内容构造的XSS的危害就大了很多。
 
在可以发表内容的论坛、讨论区、吧、博客、微博等网站上,用户发表的内容会保存起来,允许其他用户浏览。这些保存的内容显示在页面上的时候,如果没有经过正确的处理,也会把攻击者精心构造的内容显示出来,访问该内容的用户就此中招。如果该页面流传广泛,则影响会更加深远。
 
一般来说,这种攻击都做得比较隐蔽,被攻击者并不知道自己什么时候踩中了地雷;网站也很难追查问题的来源。
 
3)蠕虫式
 
上述两种方式的流传范围都有一定限度;最彻底最暴力的方式是使用蠕虫——就是首先发一个有问题的文章,浏览者阅读时会被暗中执行恶意代码,发表一篇新的文章的,该文章也含有同样的恶意代码。这样有可能在最快时间内将攻击铺满整个网站。蠕虫式攻击将暗中偷偷摸摸的攻击行为变成了光明正大的攻城拔寨,极容易被发现和修复。
 
下面是6月28日新浪微博被蠕虫攻击的报告,其实质就是XSS攻击。
 
http://www.ijinshan.com/news/20110629001.shtml
 
3。破坏方式
 
1)破坏页面结构
 
用户输入的内容包含了html的标签,与前面的标签等闭合,导致页面的DIV结构发生变化,页面错乱。
测试
测试
 
用户输入的内容包含了单引号或双引号,与前面的单引号或双引号匹配,导致后面的内容丢失,显示不出来。
 
 
可以使用php内置方法htmlspecialchars来处理待输出的内容,将上述字符转义。
 
综合1)和2)两者需要处理的内容基本是一样的,而多转义并不会带来副作用,因此可以使用统一的处理方法
 
$out = htmlspecialchars($out,ENT_QUOTES)
 
注意第二个参数是明确要求将双引号进行转义。
 
3)JS
 
将要输出到js代码片断中的用户输入内容没有好的办法进行处理;仅转义少数字符不能保证去掉所有的攻击可能。
 
因此,一般建议不要把用户产生的内容直接输出到js片断中。
 
如果条件所限,必须将内容直接输出,有如下方法可供选择:
 
a) 如果待输出的内容有特定的取值返围或者特定的格式,可以使用白名单或者正则表达式进行处理。
 
b) 可以将内容输出到html的隐藏标签或隐藏表单中,js通过获取标签的内容得到该内容。
 
c) 使用json_encode将内容编码后输出到页面上,页面上使用eval将内容取出来。
 
5。检查
 
那么,对已有的页面,该如何检查呢?
 
这个问题的回答是,目前没有很好的办法能完全检查出可能存在xss攻击的页面;有一些办法可以检查出比较明显的疏漏,其基本思路如下:
 
1)从apache的access_log中取出所有unique的请求,依次修改其某一个参数为 "<script>alert('xx')</script>",发起请求;
 
2)获取返回的内容,如果内容中有原样的该字符串,表明此可疑输入没有经过处理便输出到页面上,页面存在隐患,需要处理。
 
通过这种办法,可以检查出绝大多数能通过get请求发起的xss攻击。那些在access_log没有出现的请求参数,这里没有检查到,可能有所遗漏,就需要手动去整理,测试。
 
通过Post发起的请求需要用另外一种策略进行检查。其思路如下:
 
将网站上所有可以输入的表单,依次输入特征字符串,比如说<'">,如果提交后产生的页面中含有未处理的此字符串,说明存在隐患。
365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/server/1617.html