黑客是否有可能绕过上传 php 文件?

信息安全 php 上传文件 html
2021-08-17 13:14:13

我想在我的脚本中提供一个过滤系统。这里是 :

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png","bmp");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (in_array($extension, $allowedExts)){
//here is rst of codes
?>

意味着我的脚本将检查扩展名以使用explode. 那么,现在黑客有可能绕过这个系统吗?并上传恶意代码脚本?

3个回答

考虑到包含这一小段代码的应用程序,仍然可能会出现很多问题。

  1. 攻击者可以使用本地文件包含漏洞通过将 PHP 代码放入上传图像的元数据中来获取远程代码执行
  2. 攻击者可能会
    使用目录遍历在任何目录中写入具有有效文件扩展名的图像
  3. 在旧版本的 PHP 中,攻击者可以使用空字节来通过截断文件名来控制扩展名,但从PHP 5.3.4 开始FILE 函数将转义空字节。

虽然它本身并不是 100% 安全的,但我建议您检查文件的 MIME 类型,而不是使用exif_imagetype. 这是帮助验证图像的好步骤。

任何人都可以将恶意 PHP 代码粘贴到 .gif 文件中,并且通过许多 fcgi/fpm 和路由,如果将其上传到面向 Web 的目录并且攻击者浏览到此页面,它将被 PHP 解析。

为了避免这种情况,您要确保您的文件不在您的 webroot 中,如果您使用某种路由或 url 重写,请关闭 PHP-FPM/mod_php.gif|.jpg|.jpeg等。从长远来看,这将帮助您好。除非某处有 0day,否则文件的上传不会在其eval()上运行,因此必须直接访问该文件才能使其具有恶意。

除此之外,我建议您array getimagesize ( string $filename [, array &$imageinfo ] )在图像上运行如果返回0,则它不是有效图像。您也不需要这样做GD

是的。

绕过像您正在使用的简单检查的一种常见方法是使用真实的图片文件(例如 JPEG)并在图片的注释中添加远程外壳。

要检查您的实现是否易受攻击,只需拍摄任何有效图片并使用您选择的编辑器(例如 Photoshop、GIMP)添加以下基本 shell 作为注释:

<?php echo "<pre>"; system($_GET['cmd']); ?>

当图片上传成功后,尝试使用设置为简单命令的cmd参数调用它(例如/upload/shell.jpg?cmd=ls)。如果上传它的文件夹执行任何类型的文件,那么 shell 应该是活动的。

注意:一些 PHP 函数,比如这里使用的系统,可以被禁用。在这种情况下,可以尝试多种或不同的功能来执行命令。