允许较大的 http 正文大小的潜在漏洞是什么?

信息安全 php http 上传文件 nginx
2021-09-06 21:09:08

使用 NGINX 和 PHP,我允许将 5GB 文件“上传”到我的服务器,尽管它们不会被下载,除非它们是“合法的”(这是另一个问题;))。我想知道这是否使 DDOS 攻击或其他攻击更容易,或者它是否像正常情况一样容易受到攻击,因为 1 个大请求与许多小型 http 请求的密集度相同,如果不那么密集的话。

2个回答

我将寻求答案,但我也不是该特定主题的专家,因此我很想阅读可能出现的任何其他答案。

我相信简短的回答是:允许大型 HTTP 帖子正文肯定为 DOS 攻击提供了一条途径,但它不一定是 DOS 攻击最有吸引力的途径。因此,我当然不会设置比我需要的大得多的最大车身尺寸,但如果我需要一个大的柱体,我会允许它而不用担心太多。详细:

首选 DDOS 攻击媒介

有很多方法可以对网站进行 DOS。如今,最大的 DDOS 攻击来自放大的 DDOS 攻击。这些攻击(通常)攻击 UDP 协议,这些协议可以接收少量流量并以大量流量进行响应,这些流量可以定向到 Internet 上的任意 IP 地址。例如,当前(2018 年 3 月)最大的 DDOS 攻击记录使用这种攻击向量(https://githubengineering.com/ddos-incident-report/)袭击了 github。这些类型的攻击试图完全压倒目标服务器的网络容量,只要攻击持续,它们就会瘫痪。

github 事件中使用的向量具有约 51,000 的放大系数,这意味着对于原始僵尸网络创建的每个网络流量字节,有 51,000 个字节到达 github。在攻击高峰期,github 的网络(或他们的 DDOS 缓解提供商的网络)看到了大约 1.35Tbs 的流量。假设放大系数为 51000 倍,这意味着触发攻击的实际僵尸网络可以推出大约 26Mbs 的流量。如果使用相同的僵尸网络将大量数据简单地上传到接受大量上传的端点,则不会出现放大,并且 githhub 将遭受 DDOS 攻击,消耗大约 26Mbs 的 github 流量。我怀疑他们会注意到。

上面我重点介绍了基于放大的 DDOS 攻击,但它们显然不是唯一的选择。放大部分是使这个成功的原因(就网络流量而言 - 它实际上并没有关闭 github),但您还需要找到一个合适的放大向量,您可以利用它来执行此类攻击。否则,还有许多其他方法可以对服务进行 DDOS:您可以超出其 CPU 功能(想象反复访问性能不佳的端点,每个请求会占用大量 CPU 或数据库资源),您可以通过简单地抛出大量数据来超出其网络在那里,您可以保持打开的 TCP/IP 连接,直到服务器清空其连接池等...

攻击文件上传的缺点

综上所述:超越文件上传端点肯定是尝试 DOS 系统的一种方法,但可能不是最好的。问题在于它使攻击者和防御者处于平等的领土上。你只能用你能发送的尽可能多的数据来压倒目标。使用开放的连接池、攻击高资源端点、放大攻击等都是攻击资源的方法,这些方法可以为您的资源提供额外的杠杆作用,并使 DDOS 人员更容易受到攻击。结果,您当然可以通过压倒文件上传端点来对某人进行 DOS,但可能有更有效的方法可以做到这一点。此外,只要您有足够的网络流量可供使用,我认为点击文件上传端点不会有任何特别的优势:我相信无论另一端的服务器是否喜欢接收数据,您都可以发送数据。我可以看到的关于点击文件上传端点的唯一可能的优势(虽然再次,不是该领域的专家),是文件最终实际上存储在某个服务器上,并且您可能能够填满硬盘驱动器带有大型临时文件。即使这可能不是最有效的 DOS 策略。

所有这一切都让我们回到了我最初所说的:要聪明,不要将您的服务器配置为允许比您需要的更大的上传,但就安全问题而言,可能存在比这更大的问题。

保护文件上传端点

虽然文件上传端点可能不是 DDOS 攻击的首选地点,但这并不意味着安全问题应该消失。正如您在评论中提到的那样,要求用户访问并没有多大帮助:PHP 无论如何都会接受上传并将其存储在临时位置。当您对上传不做任何事情时,它会立即被删除,但它仍会暂时写入磁盘。

您对设置的其他建议 /tmp目录大小足够大,你不能用完可用空间(取决于你的可用带宽)肯定会确保你的硬盘驱动器不会填满(尽管溢出 /tmp 目录不一定会杀死服务器,特别是如果它在自己的分区上)。然后,这显示了您链中的下一个弱点 - 如果您的所有带宽都被用完以试图压倒文件上传端点,那么无论您的机器是否有硬盘空间,您的服务都会关闭 -驱动器(因为您的网络带宽已全部用完)。这几乎可以回答您的问题,因为那时通过文件上传的 DDOS 不再可能。如果您的文件上传端点不能被 DDOS 攻击,除非完全压倒您的网络带宽,那么没有人会费心尝试对您的文件上传端点进行 DDOS 攻击:他们只会针对您提供足够的流量以试图压倒您的网络连接。那时,我会说您的文件上传是安全的!

我不确定购买这么多硬盘空间需要多少钱。这取决于您的托管服务提供商(尽管硬盘空间通常很便宜)和您的可用带宽。话虽如此,保护这样的系统还有一个非常简单的解决方案:将您的文件上传系统放在单独网络上的单独服务器上,(uploads.example.com)并确保您的所有系统都有一些 DDOS 保护(即 cloudflare)。然后,针对您的文件上传端点的 DDOS 可以将其关闭,但您的其余系统将继续正常运行。当然,在那种情况下,我无法想象有人会尝试对您的文件上传进行 DDOS。他们只会试图找到一个更有吸引力的攻击媒介,它会影响您的主要系统。

允许大量上传时存在两大风险。

第一个很简单,上传的文件可能会填满服务器上的磁盘空间。即使巧妙地使用配额或挂载,这也可能导致其他上传失败。在配置不太严格的系统中,它可能会导致其他应用程序出现故障,甚至导致操作系统出现故障。一个特殊的问题是确保在所有情况下最终都会删除上传的文件。

第二个风险,可能对攻击者更具吸引力,是大型上传可能会在处理文件的代码中创建缓冲区溢出。简而言之,这样的溢出可能会破坏检查文件是否“合法”的代码,从而使非法上传最终成为明显合法的下载。然而,缓冲区溢出也是权限提升的潜在来源,允许攻击者逃离 Web 服务器并直接在操作系统中执行操作。

因此,您至少应该考虑:

  • 如果文件上传填满磁盘空间会发生什么?
  • 您的文件处理(例如验证)是否将整个文件读入内存,还是以较小的块处理它?如果您使用第三方解析器(例如用于 XML),请特别注意
  • 您的代码如何处理文件处理中的意外失败?例如,您希望验证返回VALIDor INVALID,但它会出现段错误。这会导致上传被解释为有效文件吗?
  • 即使发生错误,大文件是否会从磁盘上存在的任何地方删除?