目录
- 什么是文件上传漏洞?
- 文件上传请求如何工作
- 为什么文件上传漏洞是个问题?
- 漏洞 #1:通过文件内容
- 远程代码执行(Web Shell 上传)
- 绕过黑名单保护
- 案例 1:
- 案例 2:
- 案例 3:
- 案例 4:
- 绕过白名单保护
- 案例 1: 绕过文件扩展名检查
- 案例 2:空字节注入
- 漏洞 #2:通过 SVG 文件
- 案例 1:SSRF
- 案例二:XXE
- 案例 3:跨站脚本
- 漏洞 #3:通过文件名
- 案例 1:DoS(拒绝服务)
- 案例 2:XSS(跨站脚本)
- 漏洞 #4:通过文件大小
- 案例 1:
- 如何防范和缓解文件上传漏洞
- 最后
𝓲’𝓶 𝓪 𝓵𝓾𝓷𝓪𝓽𝓲𝓬, 𝓱𝓪𝓱𝓪𝓱𝓪𝓱𝓪, 𝓪𝓷𝔂𝔀𝓪𝔂, 𝓲𝓯 𝔂𝓸𝓾 𝓭𝓸𝓷’𝓽 𝔀𝓾𝓷𝓭𝓮𝓻𝓼𝓽𝓪𝓷𝓭, 𝓘 𝓳𝓾𝓼𝓽 𝔀𝓻𝓲𝓽𝓮 𝓲𝓽 𝓬𝓪𝓼𝓾𝓪𝓵𝓵𝔂, 𝓘’𝓶 𝓪 𝓵𝓾𝓷𝓪𝓽𝓲𝓬
什么是文件上传漏洞?
当服务器允许用户在不验证文件名称、大小、类型、内容等的情况下上传文件时,就会出现文件上传漏洞。在本文中,我们将了解可用于利用不当文件上传功能并绕过常见防御机制的常见攻击媒介。
文件上传请求如何工作
在深入研究文件上传功能的利用部分之前,让我们更深入地了解文件上传请求。文件上传请求有 5 个部分,如下所示:
- 文件名:这是上传文件的文件名。
- Content-Type : Content-Type 头用于指示上传文件的内容类型。例如:对于 png 文件,它是“image/png”,对于文本文件,它是“text/plain”。
- 幻数:幻数是文件开头的一系列十六进制值,用于确定文件内容的类型。
- 文件内容:这是文件的主要内容。
现在我们了解了文件上传请求及其组件的基础知识,让我们探索一些用于利用文件上传的技术。
为什么文件上传漏洞是个问题?
文件上传漏洞往往被标记为高严重性。以下是文件上传功能实施不当带来的一些风险:
- 服务器端攻击:文件上传漏洞可以通过上传恶意 web-shell 来破坏,该 web-shell 允许攻击者运行任意命令、浏览本地文件等。
- 客户端攻击:文件上传漏洞还使应用程序容易受到跨站点脚本攻击或跨站点内容劫持。
- DoS 攻击:文件上传功能的不当实施也会导致拒绝服务攻击。
- 文件上传页面有时会在错误消息中泄露内部敏感信息,例如服务器内部路径。
从某种意义上说,文件上传漏洞是许多其他可能严重危害您的应用程序的安全漏洞的“网关漏洞”。现在我们来看看攻击者用来利用此漏洞的一些具体技术。
漏洞 #1:通过文件内容
远程代码执行(Web Shell 上传)
让我们从一个基本的 web shell 上传开始,它允许您在易受攻击的服务器上运行任意命令。在下面的示例中,该应用程序在易受攻击的服务器上没有安全性,这允许攻击者上传具有以下有效负载的恶意 php 文件:
<?php echo system($_GET['command']); ?>
现在他们可以使用 URL 在 Web 服务器上运行任意命令,即https://endpointofuploadedfile?command={command}。在大多数情况下,应用程序不允许用户将恶意文件上传到应用程序。但是可以使用您在下面看到的技术绕过这些安全措施。
绕过黑名单保护
列入黑名单的主要问题是您无法真正将所有可能的向量列入黑名单。
案例 1:
通过将被阻止的扩展名更改为大写让我们从基本的旁路开始。假设开发人员在较小的情况下屏蔽了 php、html、exe 和其他扩展。在这些情况下,我们可以更改扩展名的大小写以绕过文件上传限制。例如,可以通过将扩展名更改为 PHP 来上传 php 文件。
案例 2:
使用可能未被阻止的替代扩展程序绕过例如,开发人员可能会阻止 php、html、exe 扩展。攻击者仍然可以使用 php1、php2、php3、php4、php5、php6、phtml 等替代扩展名来绕过限制并上传恶意文件。Windows IIS 服务器的等效情况是开发人员阻止了 asp 扩展。攻击者仍然可以使用“asa”和“cer”等扩展名来绕过这种保护。IIS 7.5 及以下版本将*.asp 和*.cer 都映射到asp.dll,从而执行ASP 代码。
案例 3:
使用文件遍历序列上传文件有时服务器会限制在用户控制的目录中执行脚本,因为它们被明确配置为这样做。如果服务器与预期的内容类型不匹配,它们可能会返回某种错误。这些限制取决于目录对目录的基础。例如:file.jpg 在 /users/images 目录中上传。有可能即使攻击者能够将恶意脚本上传到该目录,服务器也不会执行该脚本。我们可以使用文件遍历序列“…/exploit.php”绕过它(如果服务器没有验证文件名)。另一个使用文件遍历序列进行利用的实例是使用服务器本地文件的名称上传序列(上传名称为“…/…/logo.png”的文件以更改应用程序的徽标)
案例 4:
绕过内容类型检查开发人员可能会使用内容类型标头检查文件的类型。例如,当您尝试上传一个 php 文件时,内容类型将为“application/x-httpd-php”。content-type 的值仍然可以使用任何代理工具进行更改。为了绕过这种保护,拦截请求并将内容类型的值更改为可接受的值(image/png,image/jpeg)。
案例 5:绕过文件类型检查
Web 应用程序可能会检查文件的签名以验证文件的类型。在这些情况下,我们可以通过添加一个幻数的文件(到有效负载的开头)或使用 exiftool 在文件的注释中添加我们的代码来绕过此检查。
绕过白名单保护
白名单保护是指开发者只允许用户上传特定类型的文件。这似乎比黑名单更容易实现,但仍然有办法绕过白名单保护。
案例 1: 绕过文件扩展名检查
该应用程序仅验证上传的文件包含有效扩展名,但不验证文件是否以该有效扩展名结尾。例如,我们可以通过使用文件名“exploit.jpg.php”来绕过它
案例 2:空字节注入
如果应用程序具有用 PHP 或 JavaScript 等高级语言编写的验证,但服务器使用 C 或 C++ 等语言处理文件,那么这可能会导致文件处理方式混乱。可以使用空字节(exploit.jpg%00.php 或 exploit.jpg\00.php)绕过保护。
漏洞 #2:通过 SVG 文件
一些应用程序允许用户上传稍后在服务器端处理的 SVG 文件。由于 SVG 格式使用 XML,攻击者可以创建恶意文件来利用 SSRF 和 XXE 等漏洞。
案例 1:SSRF
对于此漏洞,攻击者需要创建一个包含以下内容的 SVG 文件,并将受控服务器 URL 更改为自己的服务器:
<svg xmlns:svg=” http://www.w3.org/2000/svg “ xmlns=” http://www.w3.org/2000/svg “ xmlns:xlink=” http://www.w3 .org/1999/xlink " width=”200" height=”200">
<图片高度=”30” 宽度=”30”
xlink:href=”https://controlledserver.com/pic.svg”/>
</svg>
如果他们将此文件上传到应用程序,如果应用程序易受攻击,将会有一个回调。
案例二:XXE
在这里,攻击者创建一个内容如下所示的 SVG 文件,如果服务器易受攻击,则本地文件的内容在响应或图像本身中可见。
<?xml version=”1.0" standalone=”yes”?><!DOCTYPE test [ <!ENTITY xxe SYSTEM “file:///etc/hostname” > ]><svg width=”128px” height=”128px” xmlns=”http://www.w3.org/2000/svg” xmlns:xlink=”http://www.w3.org/1999/xlink” version=”1.1”><text font-size=”16 " x=”0" y=”16">&xxe;</text></svg>
案例 3:跨站脚本
在这种情况下,攻击者需要创建一个包含以下内容的 SVG 文件。如果服务器易受攻击,他们将看到一个弹出窗口,表明它是易受攻击的。
<svg xmlns=” http://www.w3.org/2000/svg ">
<script>警报('XSS');</script>
<rect x=”0" height=”100” width=”100” style=”fill: #cccccc”/>
<line x1=”20" y1=”80” x2=”80” y2=”80" style=”stroke: #ff0000; 笔划宽度:5;”/>
</svg>
漏洞 #3:通过文件名
案例 1:DoS(拒绝服务)
当上传文件的名称没有文本限制时,攻击者可能会创建一个长而重的文件名,从而对应用程序造成拒绝服务攻击。
案例 2:XSS(跨站脚本)
文件名有时本身会反映在页面中,因此只需更改文件名就可以在易受攻击的服务器上触发跨站点脚本。
对于此漏洞利用,只需将文件重命名为“/>
漏洞 #4:通过文件大小
案例 1:
拒绝服务Web 应用程序有时不验证上传文件的文件大小。在这种情况下,Web 应用程序可能容易受到拒绝服务攻击,可以通过上传许多会耗尽服务器托管空间的大文件来加以利用。此漏洞也称为像素泛洪攻击。
如何防范和缓解文件上传漏洞
- 您的应用程序应始终检查上传文件的内容。如果它检测到任何恶意内容,则必须丢弃该文件。
- 维护允许扩展的白名单。
- 确保一个文件不包含多个扩展名。确保文件名不能包含任何特殊字符,如“;”、“:”、“>”、“<”、“/”、“\”、“.”、“*”、“%”等。
- 限制文件名的大小。
- 限制文件上传的大小(最小和最大)以防止 DOS 攻击。
- 确保禁用存储所有上传文件的目录的执行权限。确保上传的文件不会替换服务器的本地文件。
最后
最后的最后的最后的最后的最后的再见