XSS漏洞利用方式
在Sohu的博客里,我发现的并且可以利用的XSS点有“个人档案”区(因为用户自建版块的性质和其相同,所以归为一类)和“文章发布”区。它们都没有过滤Style(层叠样式表)的注释信息,使得通过注释绕过的特殊脚本字符插入得以实现,利用方式如下:
<img style="xss:expr/*XSS*/ession(alert('xss'))" />
其中,“xss”这个属性可以随意拟定,改成“width”或“height”什么的都没有关系;“/*XSS*/”为注释的内容,内容也可以随意指定;但是在注释两边的字符除了左右位置可以改变,具体的值是不能改变的,因为它们连起来正是我曾经提到过的三个特殊的引起事件的标志之一——“expression”,由于IE会忽略掉样式表中的注释,从而使得我们的XSS脚本代码可以顺利执行。
不过,这样的代码在“个人档案”里可以执行,但在“文章发布”里却会被二次过滤(即在转向文章页面的客户端加载的时候会被过滤掉);而且由于expression是不间断地加载的,所以会使电脑的CPU占用率很高(大家可以打开资源管理器,在有“expression”的网页上快速移动鼠标,就会看到CPU占用率迅速飙升);并且“expression”是IE的专利,在Firefox下是不支持的,这使我们不能编写通用的XSS脚本。所以,我们要采取另一种插入跨站方式——编码,Sohu博客对于脚本编码没有过滤的是16进制的Java式编码,利用方式如下:
[Copy to clipboard][ - ]
CODE:<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">
转码之前的代码为:
[Copy to clipboard][ - ]
CODE:<DIV STYLE="background-image:url(javascript:alert('XSS')) ">
但是由于“javascript:”对于复杂的复合式脚本代码显得力不从心,所以我们不得不对代码进行一些改进。Samy(著名的Myspace Worm)采取的方法是把执行代码写进标签另一属性里,并通过Document对象调用,使用Eval执行,比如下面的代码。
<div id="mycode" expr="alert('xss')" style="background:url('javascript:eval(document.all.mycode.expr)')">
但是由于Sohu博客禁止除Style以外的属性,所以这种方式对我们不适用,我们只能直接把代码写进Eval里。但此时利用代码仍没有完成——由于我们对Style属性用了双引号,对UEL用了单引号,因此在Eval这个函数里就不能再有引号了,否则就会混淆。Samy的方法是对单引号和双引号进行相应转换:
[Copy to clipboard][ - ]
CODE:var B=String.fromCharCode(34);var A=String.fromCharCode(39);
//34为双引号十进制,39为单引号十进制
但我们这里事实上在Eval本身时就已经没有引号可用了,更别提语句里面的,所以这个方法无效。我所采取地是把整个XSS代码全部转换为十进制,然后用String.fromCharCode解码,用Eval执行。这样,内部代码可以随意用单引号,而不会影响代码本身,所以测试字符转换如下:
[Copy to clipboard][ - ]
CODE:<DIV STYLE="background-image:url(javascript:eval(String.fromCharCode(97,108,101,114,116,40
2008-11-19 at 14:41