【问题标题】:Block upload of executable images (PHP)阻止上传可执行图像 (PHP)
【发布时间】:2010-05-17 19:07:46
【问题描述】:

我注意到一个用户试图通过上传头像图像来创建漏洞利用。当用户向我报告他们从诺顿防病毒软件收到“HTTP 可疑可执行图像下载”通知时,发现了这一点。此警告引用了用户的头像图像。我认为他们实际上并没有在窃取信息或类似的事情上取得任何成就,但我认为如果这个洞打开足够长的时间是有可能的。我使用 PHP 上传图片文件,并检查上传的文件是 png、jpg、bmp 还是 gif。

这是检查它是否是图像的代码:

$allow_types = array('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap');
if (in_array($this->tmp_image['type'], 
$this->allow_types)) {
   return true;
}

【问题讨论】:

    标签: php security image upload


    【解决方案1】:

    没有办法阻止恶意文件的上传。相反,您需要关心的是如何处理这些文件。

    重新保存图像文件等建议注定失败。在已知的图像压缩器运行后,可以通过对位进行排序以使它们按照攻击者想要的顺序来绕过这种操作。

    有很多方法可以组合图像和恶意文件。恶意文件可能是可执行文件,或者仅包含可由浏览器解释的 JavaScript。此外,您应该如何重新保存不是图像类型的文件?

    在处理文件上传时,必须注意以下事项。

    • 限制每个用户上传的字节数,以免您的服务器空间不足。

    • 限制每个用户上传的文件数量,这样您的服务器就不会用完 inode。

    • 将文件存储在文档根目录之上,这样它们就不能被直接访问。

    • 通过 PHP 代理脚本提供您的文件,编写如下内容:

      $data = file_get_contents('/home/account/files/file.png');
      header('Content-Type: image/png');
      header('Content-Length: '. strlen($data));
      header('X-Content-Type-Options: nosniff');
      echo $data;
      
    • 重命名上传的文件,使其具有完全随机的名称,不带扩展名。如果您需要存储文件名(和扩展名/类型),请将详细信息存储在数据库中。

    • 如果需要,仅在用户有权限时才提供文件。

    • 永远不要包含/执行您上传的文件。这意味着 PHP 中没有 include 或 require。没有包含它们的 HTML 脚本标签或样式表标签。没有 Apache Include 命令包括它们。以此类推。

    • 如果可能,请提供其他来源的文件。这消除了 Flash 出现的主要问题。使用不同的端口、域名或 IP 地址也可以。从子域提供服务是危险的,并且使用 IP 地址实现会稍微困难一些(即,您不能通过域提供文件,只能通过 IP 提供文件,也不能通过 IP 提供站点,而是通过域提供)。

    • 小心 LFI 和 RFI。在 fopen()read() 等函数中使用文件名之前重命名文件名,并根据需要验证/清理任何目录值。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是重新采样图片。获取一个简单的图像处理库(GD)并加载重新保存图像,它应该有效地去除任何可执行内容,或者如果图像只是一个重命名的 exe,则只是硬失败。

      【讨论】:

      • 重新保存是过度操作。如果它是被屏蔽的 exe,它将在打开时失败
      • 不是过度操作。某些文件格式(主要是 gif)允许您在文件中嵌入非图像数据。可靠地摆脱它的唯一方法是加载并重新保存。
      • 是的,如果图像既是图像又是可执行文件,则重新保存是为了杀死额外的嵌入数据。
      【解决方案3】:

      使用imagecreatefromjpeg(和其他imagecreatefrom*)来检查传递的数据是否是实际图像。 exe不会通过。

      【讨论】:

      • getimagesize 可能是更好的选择,因为它不会加载资源。
      【解决方案4】:

      我认为最好的方法是验证文件是上传时的图像。如果不是,则错误用户,就像使用任何其他未经验证的输入数据一样

      查看此链接 http://www.bitrepository.com/how-to-validate-an-image-upload.html

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2019-08-09
        • 2022-07-02
        • 1970-01-01
        相关资源
        最近更新 更多