将上传的可执行文件的文件扩展名更改为 .png 是否会使其安全?

信息安全 Web应用程序 php 服务器 上传文件
2021-08-21 22:31:54

我的一个同事有一个个人网站,他允许用户上传一定大小的任何东西,

但在实际上传之前,他会检查文件扩展名:

if ( $type == 'image/gif'){
  $ext = '.gif';
} elseif ( $type == 'image/jpeg'){
  $ext = '.jpg';
} elseif ( $type == 'image/png' ){
  $ext= '.png';
}  else {
  $ext = '.png';  
}

他对我说,通过制作所有文件图像不会对服务器造成伤害。

例如 :

  evilscript.evil

会成为 :

evilscript.png

并因此变得无用。他的说法有道理吗?

4个回答

上传的文件基本上有两种有害的方式:被执行(作为脚本或二进制文件)或在应用程序中运行/使用并滥用其中的漏洞利用(例如上传的 MP3,然后由特定的人打开)玩家,滥用其已知的弱点)。

换句话说,这完全取决于上传后文件会发生什么。如果有人能够上传 Perl 脚本,但服务器从不执行上传的文件,甚至没有安装 Perl,那么什么都不会发生。一般来说:如果您确保上传的文件永远不会运行或解释,您将是安全的。

重命名文件只有助于一件事:在某些操作系统上,某些文件扩展名可能与特定应用程序相关联。如果重命名文件,您可能会阻止使用链接的应用程序打开文件。但根据系统和设置,上传的文件可能仍会被易受攻击的应用程序打开。继续上面的例子:如果任何上传的文件被 MP3 播放器打开,即使你将它重命名为song.png,它仍然可以利用播放器的弱点(除非播放器有自己的检查层,例如只接受.mp3文件)。

重命名的文件突然不是图像,只是因为重命名。在 Unix 和类似系统上,甚至还有file分析文件类型/MIME 类型的命令。

底线:在我看来,你只能做一件事。在您的设置中非常具体地说明上传文件可以做什么以及将要做什么。任何接受这些文件的库、扩展或应用程序都应始终更新到最新版本。

不会。重命名文件不会增加安全性。

他对我说,通过制作所有文件图像不会对服务器造成伤害。

例如 evilscript.evil 会变成 evilscript.png

当您重命名evilscript.evilevilscript.png您时,不要将其变成图像。你只是改变它的名字。通常,文件名是不相关的。它只是一个数据块的名称,仅此而已。

如果您可以执行上传的脚本,那么无论其名称如何,您都可以执行此操作。如果不能,上传恶意脚本不会损害系统,因为脚本无论如何都不会执行。

但是,它可以防止文件被意外运行。重命名可以提供的唯一保护是防止被 Windows 资源管理器(或类似使用文件扩展名的 shell)意外启动。因此,当您不小心点击它时,重命名实际上会有所virus.exe帮助virus.exe~Enter

Unix shell 使用文件格式而不是扩展名。例如,您可以将脚本另存为evilscript.png并使用 Linux shell 运行它,前提是该文件具有“执行”权限。在安全性方面,通常控制文件权限而不是文件名更好。

检查上传文件的唯一扩展名是不够的。例如:检查这个问题的答案。

一个建议:有一种更可靠的方法可以找出文件的类型。如果您的朋友在 Unix 机器上运行服务器,您可以使用“ file ”命令检查文件的内容以确定格式。

有两个问题,防止对服务器的直接攻击和防止对其他客户端的攻击(这反过来可能导致对服务器的攻击)

首先是服务器,当客户端请求文件时,服务器必须决定是提供它还是以某种方式执行它。该决定可能取决于各种因素,包括。

  1. 文件扩展名
  2. 文件所在的目录
  3. 是否设置了可执行位。

我不知道有任何网络服务器在服务器端进行内容检查,但我不能排除可能存在的情况。

理想情况下,在服务器上,您不会将用户提供的文件放在首先允许执行脚本的目录中,但限制文件扩展名可能是一种明智的“纵深防御”策略,以防文件意外出错地方。

如果服务器确实决定提供文件,那么它必须决定发送什么 mime 类型。Afaict 服务器通常根据文件扩展名选择 MIME 类型。然后客户端必须决定如何处理该文件。它应该基于服务器发送的 mime 类型,但实际上它可能基于文件扩展名或检查文件的内容,

如果浏览器选择将文件视为可能涉及客户端脚本的类型,则提供文件的域变得很重要。如果文件是从您的主域提供的,那么脚本可能会读取您设置的 cookie 并使用它们来模拟用户。

我相信文件扩展名限制应该是安全策略的一部分,但不应该是全部。存储在禁止脚本执行的目录中、执行内容匹配扩展名和使用单独的域名都应该被视为整体防御策略的一部分。