为了账号安全,请及时绑定邮箱和手机立即绑定

上传安全威胁

/ 猿问

上传安全威胁

哔哔one 2019-07-15 19:37:56

上传安全威胁

我允许用户上传文件到我的服务器。我面临哪些可能的安全威胁,如何消除这些威胁?

假设我允许用户从他们的系统或网络上传图片到我的服务器。现在,为了检查这些图像的大小,我必须将它们存储在/tmp文件夹。这不冒险吗?我怎样才能将风险降到最低?

另外,假设我用的是wget从用户以我的表单上传的链接下载图片。首先,我必须将这些文件保存在我的服务器中,以检查它们是否实际上是图像。另外,如果一个恶作剧者给我一个URL,而我最终下载了一个满是恶意软件的网站呢?



查看完整描述

3 回答

?
婷婷同学_

首先,要意识到上传文件意味着用户给您很多不同格式的数据,以及用户对该数据的完全控制。这甚至是一个普通形式的文本字段的关注,文件上传是相同的和更多。第一条规则是:不要相信其中的任何一条。

通过文件上传,您从用户那里得到了什么:

  • 文件数据
  • 文件名
  • 哑剧式

这是文件上传的三个主要组件,没有一个是可信任的。

  1. 不要信任MIME类型$_FILES['file']['type']..这是一个完全任意的用户提供的值。

  2. 不要将文件名用于任何重要的内容。这是一个完全任意的用户提供的值。一般情况下,您不能信任文件扩展名或名称。不要使用以下内容将文件保存到服务器的硬盘'dir/' . $_FILES['file']['name']..如果名字是'../../../passwd',您正在覆盖其他目录中的文件。始终自己生成一个随机名称,以便将文件保存为。如果需要,可以将原始文件名作为元数据存储在数据库中。

  3. 不要让任何人或任何东西任意访问该文件。例如,如果攻击者上传malicious.php文件到您的服务器,并将其存储在站点的Webroot目录中,用户只需转到example.com/uploads/malicious.php若要执行该文件并在服务器上运行任意PHP代码,请执行以下操作。

    • 不要将任意上传的文件公开存储在任何地方,一定要将它们存储在只有应用程序才能访问它们的地方。

    • 只允许特定进程访问文件。如果应该是图像文件,则只允许读取图像并调整大小的脚本直接访问该文件。如果这个脚本在读取文件时有问题,它可能不是图像文件,标记它和/或丢弃它。其他文件类型也是如此。如果该文件应该由其他用户下载,则创建一个脚本,为文件提供下载服务,并对其不做任何其他操作。

    • 如果您不知道正在处理的文件类型,那么自己检测文件的MIME类型和/或尝试让特定的进程打开文件(例如,让图像调整大小的进程试图调整假定的图像大小)。这里也要小心,如果该过程中存在漏洞,恶意构建的文件可能会利用该漏洞导致安全漏洞(最常见的攻击示例是Adobe的PDF Reader)。


为了回答你的具体问题:

检查这些图像的大小,我必须将它们存储在我的/tmp文件夹中。这不冒险吗?

没有。如果您不对数据做任何操作,那么只将数据存储在临时文件夹中是不危险的。数据只是数据,不管其内容如何。只有在尝试执行数据或程序解析数据时才会有风险,如果程序包含解析缺陷,恶意数据可能会欺骗这些数据进行意外的操作。

当然,在磁盘上放置任何类型的恶意数据比在任何地方都没有恶意数据的风险更大。你永远不知道谁会来拿它做点什么。因此,您应该验证任何上传的数据,并尽快丢弃它,如果它没有通过验证。

如果一个恶作剧者给我一个url,而我最终下载了一个满是恶意软件的网站呢?

这取决于你到底下载了什么。一个URL最多只能生成一小块数据。如果您正在解析这些数据,并基于初始BLOB下载更多URL的内容,这就是您的问题所在。别这么做。但是即使你这么做了,你也会有一个充满东西的临时目录。再说一次,如果你对那些东西不做任何危险的事情,这并不危险。


查看完整回答
反对 回复 2019-07-15
?
喵喔喔

1简单的场景是:如果您使用的上载接口不限制允许上载的文件类型,那么攻击者就可以使用恶意代码上载PHP或.NET文件,从而导致服务器崩溃。

参见:http:/www.acunatex.com/websitesecsecurity/Upload-Forms-ward.htm上面的链接讨论了常见的问题。

还请参阅:http:/php.net/handted/en/installures.file-upad.php


查看完整回答
反对 回复 2019-07-15
?
慕莱坞7535251

以下是其中一些:

  • 当一个文件上传到服务器时,PHP将变量$_files[‘upupadedfile’][‘type’]设置为客户机正在使用的Web浏览器提供的MIME类型。但是,文件上载表单验证不能仅依赖于此值。恶意用户可以使用脚本或其他允许发送HTTPPOST请求的自动应用程序轻松上传文件,这允许他发送假MIME类型。

  • 几乎不可能编译包含攻击者可以使用的所有可能扩展的列表。例如,如果代码在托管环境中运行,通常这样的环境允许大量脚本语言,如Perl、Python、Ruby等,并且列表可以是无穷无尽的。

    恶意用户可以通过上传名为“.htaccess”的文件轻松绕过这种检查,该文件包含如下代码行:AddType application/x-httpd-php .jpg


查看完整回答
反对 回复 2019-07-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信