在GIF图片中隐藏任意脚本的方法

Posted by c4pr1c3 on October 14, 2010

-= 写在前面的,但不是废话 =-

Update-1: 看到QQ围脖上大家的讨论,发现RSnake早在07年就介绍过这个方法,看来是我out了。

Update-2: 看到有人说可以简单用正则式匹配<script src=”xxx.gif”>,但实际上很多服务器端的文件引用采用的是URL重写,所以绝非可以简单通过正则式匹配HTML代码给block掉。

首先,这个题目不是标题党。确实可以在GIF图片中隐藏很多种代码,包括C、Perl、Javascript等等,这不是我说的,是有人实验成功的:http://www.thinkfu.com/blog/gifjavascript-polyglots

其次,我写这篇文章不是为了翻译Jasvir Nagra的成果,而是对Jasvir Nagra的gifjavascript-polyglots作深入的探讨。至少,关于构造gifjavascript-polyglots的方法细节,Jasvir Nagra是没有介绍的。

再有,关于如何在GIF图片中隐藏PHPASP等,谷哥和百毒上大量充斥着”copy /b + copy /a”的方法和本文所要介绍的ployglots方法是不同的。

还有,一句话GIF法和本文提到的方法也是完全不同的。

好了,铺垫到此为止。

下面直接进入方法讲解。

-= 详细构造方法 =-

  1. 选择任意一个GIF图片,其他格式的图片可以使用图片格式转换软件转换为gif格式。我用GIMP来做GIF格式转换,一来我手上只有这个软件。二来,GIMP在转换图片为GIF格式时,会提示输入注释。而我们今天要介绍的polyglots方法正是把你要隐藏的脚本(脚本代码的开始和结束处请各保留至少2个空格,具体用处后面会讲到)写入到GIF图片的注释字段中去!
  2. 如果在步骤1中你已经使用了GIMP。那么,恭喜你。你离成功已经很近了,可以直接进入步骤3。否则的话,请使用支持2进制的文件编辑软件,直接编辑GIF图片。GIF89a格式的GIF图片(文件头是GIF89a)采用的注释符的16进制编码开始标记是:21 FE,结束标记是00。你的代码就隐藏在GIF注释块中。
  3. 运气好的话,这时候的GIF图片已经成功的成为GIF+Javascript混合体(gifjavascript-polyglots)了。但不幸的是,你通常都是一个杯具。我们还需要人工review生成的GIF图片。确保生成的GIF图片既遵守GIF89a编码格式标准,又是一段合法的Javascript脚本。以下是一个最简单的gifjavascript-polyglots实例(16进制表示该文件)

gif hex encoding demo

Jasvir Nagra

注意到上面的GIF图片有什么特点了吗?

(1). 遵循GIF89a编码规范。只要图片能够正常显示,我们就可以简单认为此条件是满足的。

(2). 是一段合法的JS代码。

GIF89a=1/* ooxx /   alert(1);     / xxoo **/

我们在步骤3主要的工作,就是修正GIF图片,以满足特点(2)。一般情况下,GIF图片中经常会随机出现2F 2A,从而造成我们精心构造的JS代码注释被破坏,从而使浏览器在解释执行JS代码时出错!我们所要做的就是将这些随机出现的2F 2A 修改为任意不会破坏注释的其他ASCII码即可。

最终的GIF文件内容只要同时满足上述的特点(1)和(2)就可以待用了。

-= 可以用于…,不能用于… =-

首先是典型引用方法:

<script src=”your_gifjavascript-polyglots.gif”></script>

其次是可以用于的场景:

由于我们的脚本隐藏在GIF图片中,而通过这种方法构造的GIF图片,除了分辨率会变得很大(由于我们修改了文件头中分辨率相关的字节),和未作处理的GIF图片在视觉上无差别(可以借助一些CSS tricks,完全消除视觉差异)。互联网上有多少网站是支持上传GIF图片的呢?嘿嘿,大部分的论坛的自定义头像、图片分享网站、围脖,都是我们隐藏JS代码的好地方。然后。。。各位看官可以自由发挥想像力了。至少,我觉得公布这个方法是给广大后端程序员添麻烦了,抱歉。。。也给做恶意网站过滤的厂商们出了个新难题了,不过解决方法还是好说的。

最后是不能用于的场景:

想偷cookie?省省吧,有同源性安全策略防着呢,没戏。

后记:

Firefox NoScript用户请注意,最新版本的NoScript是防着这招的。具体来说,你打开Firefox的错误控制台,会提示:

[NoScript] Blocking cross site Javascript served from http://bbs.byr.cn/uploadFace/L/localhost.6813.gif with wrong type info image/gif and included by http://www.huangwei.me/00.html

没有安装NoScript的Firefox用户就防不住了。不过也别太怕,至少别的站的cookie是偷不走的。

其实,近几年在多媒体内容攻击、客户端攻击的新手段上,花样层出不穷,有很多攻击思路都是奔着混搭、隐藏、二义性、临界条件等去的。我在调试的时候,还狗屎运碰到一次畸形gif搞的Firefox直接崩溃掉。看来,多媒体文件的浏览器解释执行相关的漏洞在今后很长一段时间内都会是一个攻击的热点。