如何利用文件上传漏洞-以及如何修复它们

news2024/12/26 10:08:18

目录

  • 什么是文件上传漏洞?
    • 文件上传请求如何工作
  • 为什么文件上传漏洞是个问题?
  • 漏洞 #1:通过文件内容
    • 远程代码执行(Web Shell 上传)
        • 绕过黑名单保护
          • 案例 1:
          • 案例 2:
          • 案例 3:
          • 案例 4:
          • 绕过白名单保护
          • 案例 1: 绕过文件扩展名检查
          • 案例 2:空字节注入
  • 漏洞 #2:通过 SVG 文件
            • 案例 1:SSRF
          • 案例二:XXE
          • 案例 3:跨站脚本
  • 漏洞 #3:通过文件名
          • 案例 1:DoS(拒绝服务)
          • 案例 2:XSS(跨站脚本)
  • 漏洞 #4:通过文件大小
          • 案例 1:
          • 如何防范和缓解文件上传漏洞
  • 最后

𝓲’𝓶 𝓪 𝓵𝓾𝓷𝓪𝓽𝓲𝓬, 𝓱𝓪𝓱𝓪𝓱𝓪𝓱𝓪, 𝓪𝓷𝔂𝔀𝓪𝔂, 𝓲𝓯 𝔂𝓸𝓾 𝓭𝓸𝓷’𝓽 𝔀𝓾𝓷𝓭𝓮𝓻𝓼𝓽𝓪𝓷𝓭, 𝓘 𝓳𝓾𝓼𝓽 𝔀𝓻𝓲𝓽𝓮 𝓲𝓽 𝓬𝓪𝓼𝓾𝓪𝓵𝓵𝔂, 𝓘’𝓶 𝓪 𝓵𝓾𝓷𝓪𝓽𝓲𝓬

什么是文件上传漏洞?

当服务器允许用户在不验证文件名称、大小、类型、内容等的情况下上传文件时,就会出现文件上传漏洞。在本文中,我们将了解可用于利用不当文件上传功能并绕过常见防御机制的常见攻击媒介。

文件上传请求如何工作

在深入研究文件上传功能的利用部分之前,让我们更深入地了解文件上传请求。文件上传请求有 5 个部分,如下所示:
在这里插入图片描述

  1. 文件名:这是上传文件的文件名。
  2. Content-Type : Content-Type 头用于指示上传文件的内容类型。例如:对于 png 文件,它是“image/png”,对于文本文件,它是“text/plain”。
  3. 幻数:幻数是文件开头的一系列十六进制值,用于确定文件内容的类型。
  4. 文件内容:这是文件的主要内容。
    现在我们了解了文件上传请求及其组件的基础知识,让我们探索一些用于利用文件上传的技术。

为什么文件上传漏洞是个问题?

文件上传漏洞往往被标记为高严重性。以下是文件上传功能实施不当带来的一些风险:

  • 服务器端攻击:文件上传漏洞可以通过上传恶意 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 攻击。
  • 确保禁用存储所有上传文件的目录的执行权限。确保上传的文件不会替换服务器的本地文件。

最后

最后的最后的最后的最后的最后的再见
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spark分布式内存计算框架——Spark SQL】10. External DataSource(上)数据源与格式

第六章 External DataSource 在SparkSQL模块&#xff0c;提供一套完成API接口&#xff0c;用于方便读写外部数据源的的数据&#xff08;从Spark 1.4版本提供&#xff09;&#xff0c;框架本身内置外部数据源&#xff1a; 在Spark 2.4版本中添加支持Image Source&#xff08;图…

音频信号处理笔记(一)

相关课程&#xff1a;【音频信号处理及深度学习教程】 文章目录01 信号的时域分析1.1 分帧1.1.1 幅值包络1.1.2 均方根能量0 信号的叠加&#xff1a;https://teropa.info/harmonics-explorer/ 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加: 由于和差化积&a…

【Mysql基础 —— SQL语句(一)】

文章目录概述使用启动/停止mysql服务连接mysql客户端数据模型SQLSQL语句分类DDL数据库操作表操作查询创建数据类型修改删除DML添加数据修改数据删除数据DQL基础查询条件查询聚合函数分组查询排序查询分页查询执行顺序DCL管理用户权限控制概述 数据库&#xff08;Database&#…

如何评价一个新技术——以 ChatGPT 为例

开源社KAIYUANSHE近期微信公众号订阅功能做调整啦&#xff01;没有被星标的账号在信息流里可能不显示大图了&#xff01;快星标⭐我们&#xff0c;就可以及时看到发布的文章啦&#xff01;STEP01 点击右上角标志STEP02 点击【设为星标】缘起2015 年的时候&#xff0c;我写过一篇…

DaVinci 偏好设置:用户 - UI 设置

偏好设置 - 用户/ UI 设置Preferences - User/ UI Settings工作区选项Workspace Options语言Language指定 DaVinci Resolve 软件界面所使用的语言。目前支持英语、简体中文、日语、西班牙语、葡萄牙语、法语、俄语、泰语和越南语等等。启动时重新加载上一个工作项目Reload last…

Python 连接数据源与邮件功能(九)

文章目录一、概述二、Python 连接数据源1&#xff09;Python MySQL 基础操作1、部署MySQL2、MySQL Connector 库【1】安装 mysql-connector-python 库【2】连接 MySQL【3】增加数据【4】查询数据【5】更新数据【6】删除数据2、PyMySQL 库【1】安装 PyMySQL 库【2】连接 MySQL【…

2023年数学建模美赛D题(Prioritizing the UN Sustainability Goals):SDGs 优先事项的选择

正在写&#xff0c;不断更新&#xff0c;别着急。。。 4. SDGs 优先事项的选择 4.1 基于SDG密度分布图选择优先事项 虽然每个可持续发展目标的接近度矩阵和中心性度量的结果是通用的&#xff0c;并创建了基本的可持续发展目标网络&#xff0c;但由于各国在网络的不同部分取得…

前端网格布局grid

网格布局 <style> .container {border:none;display: grid;height: 600px;grid-template-columns: 200px 1fr; /*两列&#xff0c;第一列200px&#xff0c;第二列自适应*/grid-template-rows: 50px 1fr 30px; /*三行&#xff1a;第一行&#xff1a;50px,第二行&#…

【C语言每日一题】——猜名次

【C语言每日一题】——猜名次&#x1f60e;前言&#x1f64c;猜名次&#x1f64c;解题思路分享&#xff1a;&#x1f60d;解题源码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神…

大数据之-Nifi-应用场景2-2_设置putfile处理器自动创建目标文件夹_以及存在重复文件时自动覆盖---大数据之Nifi工作笔记0006

上一节我们留了两个问题,一个是,如果我们没有创建putfile要写入的目标文件夹,会报错吗? 可以看到我们putfile目标文件夹是上面这个目录 我们来试一试,如果目标文件夹不存在,putfile处理器会自动创建吗 首先我们删除这个target目标文件夹 然后我们进入cd source目录,源文件夹目…

echart在微信小程序的使用

echart在微信小程序的使用 echarts不显示在微信小程序 <!-- 微信小程序的echart的使用 --> <view class"container"><ec-canvas id"mychart-dom-bar" canvas-id"mychart-bar" ec"{{ ec }}"></ec-canvas> &l…

SVNH数据(.mat格式)转为图像(.png)matlab代码

一、获取SVNH数据数据集集地址-http://ufldl.stanford.edu/housenumbers/提供两种格式的数据&#xff1a;1.Format 1&#xff0c;图像形式&#xff0c;压缩包2.Format 2&#xff0c; .mat格式的数据10 classes, 1 for each digit. Digit 1 has label 1, 9 has label 9 and 0 ha…

Git在日常使用过程中的常用命令

文章目录Git在日常使用过程中的常用命令写在前面1. 创建本地仓库2. 将本地文件添加到暂存区3. 将本地文件从暂存区撤销4. 将修改提交到本地仓库5. clone远程版本库到本地。6. 为本地版本库添加一个远程仓库7. 推送到远程仓库8. 将远程分支内容拉取到本地Git在日常使用过程中的常…

Docker下快速搭建RabbitMQ单例及集群

引子生命在于折腾&#xff0c;为上数据实时化用到了消息传送的内容&#xff0c;当时也和总公司人员商量选型&#xff0c;kafka不能区分分公司就暂定用了RbtMQ刚好个人也在研究容器及分布式部署相关内容就在docker上实践单机 docker&#xff08;要想快 先看问题 避免踩坑&#x…

Linux 简介

Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 …

[安装]ThinkPad X250加装固态硬盘教程

方案&#xff1a;保留原有的机械硬盘&#xff0c;再加装一个固态硬盘作为系统盘。由于X250没有光驱&#xff0c;这样就无法使用第二个2.5寸的硬盘。还好&#xff0c;X250留有一个M.2接口&#xff0c;这样&#xff0c;就可以使用NGFF M.2接口的固态硬盘。不过&#xff0c;这种接…

如何在 Python 中验证用户输入

要验证用户输入&#xff1a; 使用 while 循环进行迭代&#xff0c;直到提供的输入值有效。检查输入值在每次迭代中是否有效。如果该值有效&#xff0c;则跳出 while 循环。 # ✅ 验证用户输入的是否是整数num 0while True:try:num int(input("Enter an integer 1-10: …

python练习

项目场景一&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 问题描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶…

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

文章目录1 Socket讲解2 基于Socket的TCP编程3 客户端Socket的工作过程包含以下四个基本的步骤3.1 客户端创建Socket对象4 服务器程序的工作过程包含以下四个基本的步骤&#xff1a;4.1 服务器建立ServerSocket对象5 案例实现 客户端和服务端通信5.1 代码实现5.2 实现结果6 更多…

cgroup基础介绍

一项新概念的产生&#xff0c;必然有其原因&#xff0c;cgroup也不例外&#xff0c;最初由谷歌工程师Paul Menage和Rohit Seth提出【1】&#xff1a;因为计算机硬件能力越来越强大&#xff0c;为了提高机器的使用效率&#xff0c;可以在同一台机器上运行不同运算模型的工作。开…