web网站的任意文件上传下载漏洞解析

news2024/11/23 22:36:13

免责申明

        本文仅是用于学习检测自己搭建的任意文件上传下载漏洞相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 如您继续阅读该文章即表明您默认遵守该内容。

一、任意文件上传漏洞

1.1、任意文件上传漏洞介绍

        大部分的Web网站都拥有文件上传文件的接口(允许上传图片、视频、头像、文档等其他类型的文件到服务器上);但是如果Web网站的开发人员并没有对上传的文件相关参数、内容信息进行严格的过滤防护,未对安全进行考虑;那么攻击者就可以通过一些方法将恶意文件上传到服务器上,然后通过上传的恶意文件来访问甚至控制整个服务器。

        一般来说攻击者上传的恶意文件被称为网页后门(即WebShell)是一种木马程序,该后门的功能非常强大(可以进行查看服务器目录、服务器文件、执行系统命令、拉取或删除服务器文件等操作)。

1.2、任意文件上传漏洞测试流程

        Web网站中只要是有文件上传的位置都可以用来测试是否存在漏洞。

 1.3、任意文件上传漏洞绕过方式

任意文件上传漏洞测试方式
检测文件类型位置 说明
前端js校验绕过

1、针对前端对上传文件类型的校验,检查html元素直接将校验的js事件删除掉再测试上传文件(可通过火狐浏览器删除、谷歌和Edge浏览器好像不支持)

2、将我们需要上传的webshell文件复制一份,然后将复制的文件后缀类型修改为Web网站支持的后缀类型(如.jpg或.png),此时我们再上传修改了后缀的webshell文件,在点击上传按钮前开启抓包,抓取到包后将文件的后缀名称修改为webshell真实的后缀名称,放行即可上传文件

后端校验绕过

1、检查上传文件后缀

检查文件后缀也就是对文件类型的检验,我们可以采用黑名单、白名单的方式绕过:

《1》黑名单:指Web开发人员在编写文件上传功能对文件后缀进行校验功能编写的时候,直接将类似(.php、.asp、.aspx、.jsp)后缀内容直接加入黑名单,不然这类格式的文件上传到服务器上【这种黑名单过滤方式有缺陷,很容易绕过((如:后缀大小写混合、修改后缀名为php3、php5方法即可绕过))】。

2、检查上传文件内容

《1》MIME类型检查(MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型;主要用于设定某种扩展名的文件用一种应用程序来打开的方式类型。

【每个MIME类型由两部分组成:前面是数据的大类别、后面是具体的种类】)

常见 MIME 类型列表 - HTTP | MDN (mozilla.org)icon-default.png?t=O83Ahttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

# 常见的MIME类型如下:
application/octet-stream    //任意类型的二进制数据
application/json            //json字符串数据
text/xml                    //xml文档(.xml)
text/html                   //超文本标记标记语言内容(.html\.htm)
text/plain                  //普通文本(.txt)
application/pdf             //pdf文档(.pdf)
application/msword          //word文档(.word)
image/jpeg                  //jpeg图片(.jpg\.jpeg)
image/png                   //png图片(.png)
image/gif                   //gif图片(.gif)
video/mpeg                  //MPEG文件(.mpeg\.mpg)
video/x-msvideo             //AVI文件(.avi)
application/x-gzip          //GZIP文件(.gz)

绕过MIME类型检查的方法就是使用抓包工具去上传文件的包,然后将【Content-Type】内容修改为支持的MIME类型即可。

《2》代码使用getimagesize() 函数检查文件内容(getimagesize() 是php的一个函数,用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE 并产生一条 E_WARNING 级的错误信息)

# 绕过getimagesize()函数的三种方法:
1、直接伪造头部GIF89A;
2、CMD方法,copy /b test.png+1.php webshell.png(将需注入的文件与正常的文件合并为一个文件);
3、直接使用工具增加备注写入一句话木马(在正常文件后面添加木马内容);

1.4、以upload-labs为例进行说明上传文件漏洞绕过方式

GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场icon-default.png?t=O83Ahttps://github.com/c0ny1/upload-labs可以使用phpStudy搭配upload-labs搭建环境进行绕过测试学习任意文件上传漏洞(安装好pypStudy2016后直接将upload-labs内容放到phpStudy2016的网站根目录(www)下即可)如下图所示:

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

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

相关文章

Python 的 WSGI 简单了解

从 flask 的 hello world 说起 直接讨论 WSGI,很多人可能没有概念,我们还是先从一个简单的 hello world 程序开始吧。 from flask import Flaskapp Flask(__name__)app.route("/", methods[GET]) def index():return "Hello world!&q…

完结马哥教育SRE课程--服务篇

文章目录 一、MySQL1.数据库范式2.SQL结构化查询语言3.存储引擎InnoDB和MyISAM4.索引Index5.事务6.日志管理7.MySQL备份和恢复8.MySQL主从复制9.MySQL高可用MHA 二、Redis1.NoSQL的特点2.Redis特性3.ROB和AOF4.Redis数据结构5.Redis主从复制6.Redis 哨兵机制7.Redis Cluster 三…

bpf的了解以及bpftrace的简单练习

最近接触到bpf的概念,简单做一些练习,做以下整理,学习笔记。 0:总结 使用ebpf可以实现的功能打开新世界,可以不改变源码的情况下,实现内存,网络,对应接口等各种期望内容的监控。 …

记忆化搜索(算法篇)

算法篇之记忆化搜索 记忆化搜索 概念: 记忆化搜索就是深度优先搜索的一种优化策略,记忆化搜索深度优先搜索形式动态规划思想由于dfs本质是暴力搜索,没有很好地处理重叠子问题,因此很低效记忆化算法在求解地时候还是按照自顶向下…

固态硬盘数据怎么恢复?用这4个软件你就知道了。

其实想要恢复固态硬盘里面的数据,方法有很多种。我们可以从回收站恢复,用备份恢复,或者是找专业人员帮助恢复。如果这些方法都不行的话,可以试试使用专业的数据恢复软件。我知道的数据恢复软件就有好几款,可以分享给大…

java编程行业特点

Java编程行业是一个庞大且充满活力的领域,它涵盖了从桌面应用到企业级应用、从Web开发到移动应用、从大数据处理到云计算服务的广泛范围。Java作为一种跨平台、面向对象的编程语言,自1995年发布以来,一直受到全球开发者的青睐,并在…

我的5周年创作纪念日,不忘初心,方得始终。

一、机缘 五年前,我怀着对知识的渴望和分享的热情,踏入了 CSDN 这个充满活力的技术交流平台,开启了我的创作之旅。那时的我,刚刚在技术的海洋中启航,渴望找到一个地方记录自己的成长足迹,与更多的人分享自…

【模板的特殊继承关系】用参数化的方式表达成员函数的虚拟性

一、使用混入技术实现的简单范例 成员函数的虚拟性可以通过特殊的继承来表达&#xff0c;我们先看看一个简单的范例&#xff0c;通过混入技术来实现&#xff1a; //基类 template<typename... T> class Base:public T... { public:void myfunc(){std::cout << &q…

禹神3小时快速上手typescript

一、TypeScript简介 TypeScript 由微软开发&#xff0c;是基于 JavaScript 的⼀个扩展语⾔。TypeScript 包含了 JavaScript 的所有内容&#xff0c;即&#xff1a; TypeScript 是 JavaScrip t 的超集。TypeScript 增加了&#xff1a;静态类型检查、接⼝、 泛型等很多现代开发特…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

云计算第四阶段------CLOUD Day4---Day6

Cloud DAY4 项目架构图&#xff1a; 环境准备&#xff1a; 主机名称IP地址配置logstash192.168.1.27最低配置4核8G #书接上文&#xff0c;我们在华为云平台租了几台云服务器&#xff0c;这次买一台性能好的服务器&#xff0c;作为logstash软件部署的载体。 今天给小伙伴们带来…

【装机教程】Visual Studio Community 2019离线安装

Visual Studio 2019离线安装 由于现在 官网只支持在线安装最新版的Visual Studio 2022&#xff0c;因此 Visual Studio Community 2019需要离线安装。 下载离线安装镜像&#xff0c;并解压。点击vs_setup.exe运行。 选择安装位置&#xff0c;四处位置需要确定。 选择语言包&…

CSP-J 2019 入门级 第一轮(初赛) 完善程序(1)

【题目】 CSP-J 2019 入门级 第一轮&#xff08;初赛&#xff09; 完善程序&#xff08;1&#xff09; 1.&#xff08;矩阵变幻&#xff09;有一个奇幻的矩阵&#xff0c;在不停的变幻&#xff0c;其变幻方式为&#xff1a; 数字 0 变成矩阵 0 0 0 1 数字 1 变成矩阵 1 1 1 0 …

沉浸式利用自然语言无代码开发工具生成式AI产品应用(下)

背景 小伙伴们过去在开发应用时&#xff0c;经常需要编写大量代码文件以实现业务逻辑&#xff0c;想必肯定有小伙伴开发过类似于快消行业索赔处理、订单库存跟踪和项目审批等系统。去解决这些业务实际问题&#xff0c;我们需要定制地开发业务应用程序为这些问题提供解决方案。…

手写redis实现分布式锁详细教程,满足可续锁、可重入等分布式锁条件

前言 本文将讨论的做一个高并发场景下避不开的话题&#xff0c;即redis分布式锁。比如在淘宝 的秒杀场景、热点新闻和热搜排行榜等。可见分布式锁是一个程序员面向高级的一门必修课&#xff0c;下面请跟着本篇文章好好学习。 redis分布式锁有哪些面试题 1.Redis做分布式的时…

C语言 | Leetcode C语言题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; bool isLeafNode(struct TreeNode *node) {return !node->left && !node->right; }int sumOfLeftLeaves(struct TreeNode *root) {if (!root) {return 0;}struct TreeNode **q malloc(sizeof(struct TreeNode *) * 2001);in…

JVM 一个对象是否已经死亡?

目录 前言 引用计数法 可达性分析法 引用 finalize() 方法区回收 前言 虚拟机中垃圾回收器是掌握对象生死的判官, 只要是垃圾回收器认为需要被回收的, 那么这个对象基本可以宣告"死亡". 但是也不是所有的对象, 都需要被回收, 因此, 我们在学习垃圾回收的时候…

Linux系统应用之知识补充——OpenEuler(欧拉)的安装和基础配置

前言 这篇文章将会对OpenEuler的安装进行详解&#xff0c;一步一步跟着走下去就可以成功 注意 &#xff1a;以下的指令操作最好在root权限下进行&#xff08;即su - root&#xff09; ☀️工贵其久&#xff0c;业贵其专&#xff01; 1、OpenEuler的安装 这里我不过多介绍&a…

markdown 使用技巧

文章目录 markdown使用技巧1.标题快捷键设置2.文档可读性设置 markdown使用技巧 1.标题快捷键设置 ctl 1:一级标题 ctl 2:二级标题 ctl 3:三级标题 ctl 4:四级标题 ...2.文档可读性设置 输入~~~pro 可选择代码框&#xff0c;并且可以选择不同的字体 ctrl shift ] : 可…

Flink学习2

创建一个无界流 package com.qyt; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.Keye…