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. 其次是「权限」「文件上传目录」取消执行权限,使上传的脚本不能执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建服务器的主流中间件有哪些?如何在外网访问内网的服务?

计算机业内人士对于搭建服务器的中间件并不陌生&#xff0c;apache、tomcat、IIS、nginx 都是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。今天就说说这些中间件之间有哪些区别&#xff0c;以及如何利用快解析实现内网主机应用让外网访问。 首先说…

c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?

当将指针转换为void后&#xff0c;擦除了指针所指向对象的类型信息&#xff0c;因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个…

【状态机动态规划】3129. 找出所有稳定的二进制数组 I

本文涉及知识点 动态规划汇总 LeetCode 3129. 找出所有稳定的二进制数组 I 给你 3 个正整数 zero &#xff0c;one 和 limit 。 一个 二进制数组 arr 如果满足以下条件&#xff0c;那么我们称它是 稳定的 &#xff1a; 0 在 arr 中出现次数 恰好 为 zero 。 1 在 arr 中出现…

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…

【leetcode 141】环形链表——快慢指针(龟兔赛跑)

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

如何使用Spring Cache优化后端接口?

Spring Cache是Spring框架提供的一种缓存抽象,它可以很方便地集成到应用程序中,用于提高接口的性能和响应速度。使用Spring Cache可以避免重复执行耗时的方法,并且还可以提供一个统一的缓存管理机制,简化缓存的配置和管理。 本文将详细介绍如何使用Spring Cache来优化接口,…

【Java】JavaSE概述

1、简介 Java SE&#xff08;Java Platform, Standard Edition&#xff09;是Java技术的核心平台&#xff0c;它提供了Java编程语言、Java虚拟机&#xff08;JVM&#xff09;以及Java核心类库和API。Java SE主要用于开发和部署桌面应用程序、服务器应用程序、命令行工具和嵌入…

kkFileView——全能的在线文件预览解决方案

引言 在数字化办公日益普及的今天&#xff0c;文件的在线预览成为了一个不可或缺的功能。无论是个人还是企业&#xff0c;都希望能够在浏览器中直接打开并浏览各种格式的文档。今天&#xff0c;我们将探索一款国产开源免费的在线文件文档预览软件——kkFileView。 一、kkFile…

Pag格式在vue3中的简单使用方法

目前前端使用pag格式的方法比较少&#xff0c; 在这里我来简单实现一下pag格式在vue3中的使用方式。 第一步 先下载啦 npm i libpag 来对pag文件安装依赖 其次我们在自己想要引入的vue页面进行引入 <script setup> import { ref, computed, watchEffect, nextTick …

【设计模式深度剖析】【4】【结构型】【组合模式】| 以文件系统为例加深理解

&#x1f448;️上一篇:适配器模式 | 下一篇:桥接模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 目 录 组合模式定义英文原话直译如何理解&#xff1f; 3个角色UML类图代码示例 组合模式的优点组合模式的使用场景示例解析&#xff1a;文件系统 组合模式 组合模式&a…

C#子窗体嵌入主窗体

上位机开发中&#xff0c;经常会需要将子窗体嵌入到主窗体。 运行结果 核心实现&#xff1a; private void button2_Click(object sender, EventArgs e){Form3 childForm new Form3();//判断容器中是否已经打开子窗体&#xff0c;如果打开现将其关闭foreach (Control item in…

磐启PAN2013 2.4GHz无线收发SOC

PAN2013是一款集成了8位MCU和2568bits EEPROM的无线收发SoC芯片。该芯片工作2.400~2.483GHz世界通用ISM频段&#xff0c;且集成射频收发机、频率发生器、晶体振荡器、调制解调器和低功耗MCU等功能模块&#xff0c;并且支持一对多组网和带ACK的通信模式。 用户通过MCU的I/O口向…

虚拟化平台之Proxmox VE 安装

介绍 Proxmox VE是一种基于Debian Linux和KVM的虚拟化平台&#xff0c;也可称之为Proxmox Virtual Environment。 Proxmox VE具有非常友好的用户界面&#xff0c;基于JAVA的UI和内核接口&#xff0c;方便用户登录到VM客户进行操作&#xff0c;还具有易用的模板功能&#xff0…

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…

【Leetcode 160】环形链表——双指针,细节讲解

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

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

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

高斯过程学习笔记

目录 基础知识 例子 推荐 A Visual Exploration of Gaussian Processes (distill.pub) AB - Introduction to Gaussian Processes - Part I (bridg.land) 基础知识 高斯过程回归&#xff08;Gaussian Process Regression&#xff09; - 知乎 (zhihu.com) 高斯过程&#x…

【Mac】 CleanMyMac X for mac V4.15.2中文修复版安装教程

软件介绍 CleanMyMac X是一款为Mac设计的优秀软件&#xff0c;旨在帮助用户优化其设备的性能并提供清理和维护功能。以下是 CleanMyMac X的一些主要功能和特点&#xff1a; 1.系统性能优化&#xff1a;软件可以扫描和修复潜在的性能问题&#xff0c;包括无效的登录项、大文件…

【Web】CISCN 2024初赛 题解(全)

目录 Simple_php easycms easycms_revenge ezjava mossfern sanic Simple_php 用php -r进行php代码执行 因为ban了引号&#xff0c;考虑hex2bin&#xff0c;将数字转为字符串 php -r eval(hex2bin(16进制)); 注意下面这段报错&#xff0c;因为加不了引号&#xff0c;开…