’ , , , ’ , , ’
当服务器允许用户在不验证文件名称、大小、类型、内容等的情况下上传文件时,就会出现文件上传漏洞。在本文中,我们将了解可用于利用不当文件上传功能并绕过常见防御机制的常见攻击媒介。
在深入研究文件上传功能的利用部分之前,让我们更深入地了解文件上传请求。文件上传请求有 5 个部分,如下所示:
文件上传漏洞往往被标记为高严重性。以下是文件上传功能实施不当带来的一些风险:
让我们从一个基本的 web shell 上传开始,它允许您在易受攻击的服务器上运行任意命令。在下面的示例中,该应用程序在易受攻击的服务器上没有安全性,这允许攻击者上传具有以下有效负载的恶意 php 文件:
echo system($_GET['command']); ?>
现在他们可以使用 URL 在 Web 服务器上运行任意命令,即https://endpointofuploadedfile?command={command}。在大多数情况下,应用程序不允许用户将恶意文件上传到应用程序。但是可以使用您在下面看到的技术绕过这些安全措施。
列入黑名单的主要问题是您无法真正将所有可能的向量列入黑名单。
通过将被阻止的扩展名更改为大写让我们从基本的旁路开始。假设开发人员在较小的情况下屏蔽了 php、html、exe 和其他扩展。在这些情况下,我们可以更改扩展名的大小写以绕过文件上传限制。例如,可以通过将扩展名更改为 PHP 来上传 php 文件。
使用可能未被阻止的替代扩展程序绕过例如,开发人员可能会阻止 php、html、exe 扩展。攻击者仍然可以使用 php1、php2、php3、php4、php5、php6、phtml 等替代扩展名来绕过限制并上传恶意文件。Windows IIS 服务器的等效情况是开发人员阻止了 asp 扩展。攻击者仍然可以使用“asa”和“cer”等扩展名来绕过这种保护。IIS 7.5 及以下版本将*.asp 和*.cer 都映射到asp.dll,从而执行ASP 代码。
使用文件遍历序列上传文件有时服务器会限制在用户控制的目录中执行脚本,因为它们被明确配置为这样做。如果服务器与预期的内容类型不匹配,它们可能会返回某种错误。这些限制取决于目录对目录的基础。例如:file.jpg 在 /users/images 目录中上传。有可能即使攻击者能够将恶意脚本上传到该目录,服务器也不会执行该脚本。我们可以使用文件遍历序列“…/exploit.php”绕过它(如果服务器没有验证文件名)。另一个使用文件遍历序列进行利用的实例是使用服务器本地文件的名称上传序列(上传名称为“…/…/logo.png”的文件以更改应用程序的徽标)
绕过内容类型检查开发人员可能会使用内容类型标头检查文件的类型。例如,当您尝试上传一个 php 文件时,内容类型将为“application/x-httpd-php”。content-type 的值仍然可以使用任何代理工具进行更改。为了绕过这种保护,拦截请求并将内容类型的值更改为可接受的值(image/png,image/jpeg)。
案例 5:绕过文件类型检查
Web 应用程序可能会检查文件的签名以验证文件的类型。在这些情况下,我们可以通过添加一个幻数的文件(到有效负载的开头)或使用 exiftool 在文件的注释中添加我们的代码来绕过此检查。
白名单保护是指开发者只允许用户上传特定类型的文件。这似乎比黑名单更容易实现,但仍然有办法绕过白名单保护。
该应用程序仅验证上传的文件包含有效扩展名,但不验证文件是否以该有效扩展名结尾。例如,我们可以通过使用文件名“exploit.jpg.php”来绕过它
如果应用程序具有用 PHP 或 JavaScript 等高级语言编写的验证,但服务器使用 C 或 C++ 等语言处理文件,那么这可能会导致文件处理方式混乱。可以使用空字节(exploit.jpg%00.php 或 exploit.jpg\00.php)绕过保护。
一些应用程序允许用户上传稍后在服务器端处理的 SVG 文件。由于 SVG 格式使用 XML,攻击者可以创建恶意文件来利用 SSRF 和 XXE 等漏洞。
对于此漏洞,攻击者需要创建一个包含以下内容的 SVG 文件,并将受控服务器 URL 更改为自己的服务器:
<图片高度=”30” 宽度=”30”
xlink:href=”https://controlledserver.com/pic.svg”/>
如果他们将此文件上传到应用程序,如果应用程序易受攻击,将会有一个回调。
在这里,攻击者创建一个内容如下所示的 SVG 文件,如果服务器易受攻击,则本地文件的内容在响应或图像本身中可见。
]><svg width=”128px” height=”128px” xmlns=”http://www.w3.org/2000/svg” xmlns:xlink=”http://www.w3.org/1999/xlink” version=”1.1”>&xxe;text>svg>
在这种情况下,攻击者需要创建一个包含以下内容的 SVG 文件。如果服务器易受攻击,他们将看到一个弹出窗口,表明它是易受攻击的。
当上传文件的名称没有文本限制时,攻击者可能会创建一个长而重的文件名,从而对应用程序造成拒绝服务攻击。
文件名有时本身会反映在页面中,因此只需更改文件名就可以在易受攻击的服务器上触发跨站点脚本。
对于此漏洞利用,只需将文件重命名为“/> 并将文件上传到服务器。
拒绝服务Web 应用程序有时不验证上传文件的文件大小。在这种情况下,Web 应用程序可能容易受到拒绝服务攻击,可以通过上传许多会耗尽服务器托管空间的大文件来加以利用。此漏洞也称为像素泛洪攻击。