Web安全:文件上传漏洞详解,文件上传漏洞原理、绕过方式和防御方案。

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。

在这里插入图片描述

文件上传漏洞是指:用户通过「文件上传功能」,上传「可执行脚本」文件到服务器本地,拿到服务器「权限」

漏洞形成的核心在于:网站对上传的文件过滤不够严谨。

因此,我们学习的重点要放在:文件过滤的方式,以及如何绕过这些过滤!

文件上传漏洞

  • 1、前端绕过
  • 2、MIME类型绕过
  • 3、后缀名绕过
  • 4、.htaccess绕过
  • 5、点绕过
  • 6、防御

1、前端绕过

1)程序员在「前端」使用「JS代码过滤」上传的文件,过滤成功以后,再向后端发送请求,代码逻辑示例:

//JS检查文件类型(大概逻辑)
function checkFile() {//定义允许上传的文件类型var allow_ext = ".jpg|.png|.gif";//文件类型不满足时,返回false,并弹窗if(){alert(errMsg);return false;}
}

2)我们可以根据页面是否「向后台发送请求」,来判断前端是否有过滤。

当页面发送请求时,浏览器左下角的状态栏会「显示请求链接」(显示状态栏功能,默认开启),上传文件失败时,如果左下角不显示链接,就说明前端有过滤;如果左下角显示链接,就说明前端没有过滤(或者前端过滤已经被绕过)。

在这里插入图片描述

3)绕过前端过滤的方式有两种:

  1. 「浏览器禁用JS」(JS代码不起作用,但也会导致其他正常的JS功能也不能用)
  2. 「抓包」修改文件后缀(比如上传一个jpg文件,抓包修改成php文件)

对应的练习靶场: Upload LABS Pass-1

练习靶场下载:https://github.com/c0ny1/upload-labs

靶场搭建可参考 PhpStudy下载安装使用教程


2、MIME类型绕过

浏览器通过「MIME类型」(而不是文件扩展名)来标识文件的类型,也就是http请求头中的 Content-Type 字段,内容为 image/jpegimage/pngimage/gif 时,表示文件是图片类型。

1)程序员通过请求的MIME类型,判断是否为图片类型,代码逻辑示例:

//MIME类型过滤(大概逻辑)
if($_FILES['upload_file']['type'] == 'image/jpeg'){//上传文件到upload路径
} else {//提示文件类型不正确
}

2)我们可以抓包修改 Content-Type 字段的值为 image/jpegimage/pngimage/gif ,进行绕过。

​​​​​​​​在这里插入图片描述

对应的练习靶场: Upload LABS Pass-2


3、后缀名绕过

1)程序员通过「后缀名黑名单」,禁止上传指定类型的文件,代码逻辑示例:

# 获取上传的文件名
$file_name = trim($_FILES['upload_file']['name']);
# 定义黑名单
$deny_ext = array('.asp','.aspx','.php','.jsp');
# 判断上传的文件
if(!in_array($file_ext, $file_name)) {# 如果不在黑名单中,就上传文件。
} else {# 如果在黑名单中,就弹窗提示,禁止上传。$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}

2)我们可以把文件后缀名改成黑名单之外的格式,绕过过滤。

绕过黑名单上传成功后,需要能够「解析」这类文件才能使用,是否能够解析取决于Apache配置文件中有没有添加这些后缀名。

比如:你想让Apache能够解析 .phtml.php5.phps.pht,就在Apache的httpd.conf需配置 AddType application/x-httpd-php .php .phtml .php5

常见的可执行脚本后缀名如下:

  1. .php.php1.php2.php3.php4.php5.pht.phps.phtml
  2. .asp.aspx.asa.asax、.ascx.ashx.asmx
  3. .jsp.jspa.jspx.jsw.jsv.jspf.jtml
  4. .html.htm
  5. .cer.swf.ini

对应的练习靶场:

Upload LABS Pass-5
Upload LABS Pass-6
Upload LABS Pass-8
Upload LABS Pass-9
Upload LABS Pass-10
Upload LABS Pass-11

4、.htaccess绕过

.htaccess是Apache的分布式配置文件,可以让当前目录下的文件当做php文件执行。

使用前提:

  1. Apache的http.conf配置 AllowOverride ALL 以及 AccessFileName .htaccess
  2. 未过滤.htaccess文件,且上传后不修改文件名,也就是说,文件名必须是.htaccess才会生效。

1)我们先上传一个 .htaccess,内容为:

<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

代码的意思是,让当前目录下的shell.jpg当做php文件执行。
再上传一个 shell.jpg,内容为一句话木马 <?php eval($_GET['shell']);?>,访问shell.jpg文件即可。

对应的练习靶场: Upload LABS Pass-4

5、点绕过

Windows系统为了保证文件命名的规范性,会把文件名末尾的点删掉。

我们在上传文件时抓包,在文件名默认加上点,比如 xx.php.
后端过滤时会把 php.当做文件后缀名,从而绕过很多过滤;
文件上传成功落地时,系统的命名机制删掉末尾的点,变成 xx.php,文件就能正常执行了。

Upload LABS Pass-7

6、防御

文件上传漏洞的防护有三个方向,分别是文件名、文件内容和权限

  1. 「文件名」包括过滤「文件后缀名」,修改上传后的文件名(比如基于时间的随机字符串),同时禁止「文件路径」对外展示。
  2. 「文件内容」主要是针对图片马,对文件进行「二次渲染」,这是最变态的一种方式,可以避免大部分文件上传漏洞。
  3. 其次是「权限」「文件上传目录」取消执行权限,使上传的脚本不能执行。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8&#xff0c;在Vista系统下最高只能装到IE9。 2015年以后&#xff0c;JavaScript新增了很多语法&#xff0c;比如class、extends&#xff0c;还有let和const等等&#xff0c;这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

【Django】中间件实现钩子函数预处理和后处理,局部装饰视图函数

在app文件夹里新建middleware.py继承MiddlewareMixin&#xff0c; 编写中间件类&#xff0c;重写process_request、process_response钩子函数 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

NAT 网络转换

NAT(Network Address Translation) 网络地址转换 0x01 NAT 简介 为什么要使用 NAT IPv4 网络地址紧缺&#xff0c;从而出现了私有网段&#xff0c;来补充地址&#xff0c;但私有网段不课访问 internet 所以出现了 NAT 地址转换&#xff0c;将私有地址&#xff0c;转换为公网 I…

typora自动生成标题序号(修改V1.0)

目录 带序号效果图 解决方法 带序号效果图 解决方法 1.进入文件夹&#xff1a;文件–>偏好设置–>外观–>主题–>打开主题文件夹 2.如果没有base.user.css文件&#xff0c;新建一个。如果有直接用记事本打开&#xff0c;把下面代码拷贝进去保存。 /** initiali…

rfid资产管理系统如何帮助医院管理耗材的

RFID资产管理系统可以帮助医院管理耗材&#xff0c;提高耗材管理的效率和准确性。以下是它可以发挥作用的几个方面&#xff1a; 1. 实时跟踪和定位&#xff1a;使用RFID标签附加在耗材上&#xff0c;可以实时跟踪和定位耗材的位置。医院可以通过系统查询耗材的实时位置&#xf…

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

(免费领源码)java#SSM#mysql第三方物流系统37852-计算机毕业设计项目选题推荐

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

mumu 模拟器安装

1.下载安装 下载地址 Win 历史版本&#xff1a;http://mumu.163.com/update/win/Mac 历史 版本&#xff1a;http://mumu.163.com/20200515/25905_880858.html 2.设置为竖屏 在设置中心--界面设置页面设置宽720&#xff0c;高1280&#xff0c;DPI为240&#xff0c;如下图所示。…

数据结构(六)队列

文章目录 一、概念二、逻辑结构&#xff1a;线性结构三、存储结构&#xff08;一&#xff09;顺序队列&#xff08;二&#xff09;循环队列1. 结构体定义2. 创建队列&#xff08;1&#xff09;函数定义&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 3. 入…

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术&#xff0c;将磁盘文件&#xff0c;通过映射对象&#xff08;存储在物理内存&#xff09;关联&#xff0c;映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…

Android数据缓存框架 - 内存数据载体从LiveData到StateFlow

引言&#xff1a;所有成功者的背后&#xff0c;都有一份艰苦的历程&#xff0c;不要只看到了人前的风光&#xff0c;而低估了他们背后所付出的努力。 随着flow到流行度越来越高&#xff0c;有开发者呼吁我使用flow&#xff0c;于是我就如你们所愿&#xff0c;新增了StateFlow作…

Flink本地idea运行环境配置webui

Flink本地idea运行环境配置webui 1.添加依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web_2.11</artifactId><version>1.13.6</version><scope>provided</scope></dependency&g…

【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.互联网的核心岗位以及职…

【Chapter5】死锁与饥饿,计算机操作系统教程,第四版,左万利,王英

文章目录 1.1 什么是死锁1.2 死锁的类型1.2.1 竞争资源引起的死锁1.2.2 进程间通信引起的死锁1.2.3 其他原因引起的死锁 1.3 死锁产生必要条件1.4 死锁的处理策略1.5 死锁的预防1.5.1 破坏资源独占条件1.5.2 破坏不可剥夺条件1.5.3 破坏保持申请条件1.5.4 破坏循环等待条件 1.6…

Spring Boot 统一数据返回格式

在 Spring Boot 项目中&#xff0c;统一的数据格式返回是一种良好的实践&#xff0c;它提高了代码的可维护性和一致性&#xff0c;并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…

Reader类的使用方法和技巧,你掌握了吗?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

vscode中使用conda虚拟环境

每一次配置环境&#xff0c;真的巨烦&#xff0c;网上的资料一堆还得一个个尝试&#xff0c;遂进行整理 1.准备安装好Anaconda 附带一篇测试教程&#xff0c;安装anaconda 2.准备安装vscode 安装地址&#xff1a;Visual Studio Code 3.创建Conda环境 搜索框搜索Anaconda…

音视频及H264/H256编码相关原理

一、音视频封装格式原理&#xff1a; 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

香橙派OrangePi AIpro上手初体验

一、前言 非常感谢能够收到CSDN和香橙派的OrangePi AIpro开发板评测活动的邀请&#xff1b;收到的OrangePi AIpro实物如下所示&#xff1a; 二、OrangePi AIpro介绍 通过查询香橙派官网可以了解到OrangePi AIpro的相关信息如下&#xff1a;OrangePi AIPro 开发板是香橙派联合…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…