当前位置: 首页 > article >正文

文件上传漏洞:upload-labs靶场11-20

目录

pass-11

pass-12

pass-13

pass-14

pass-15

pass-16

pass-17

pass-18

pass-19

pass-20


pass-11

分析源代码 ,发现上传文件的存放路径可控

if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

抓包查看,利用%00截断

save_path=../upload/修改为save_path=../upload/web.php%00

抓包后的信息可以看见有save_path,说明路径可控。我们通过修改路径令save_path: ../uploads/web.php%00,然后上传一个文件后缀为.jpgphpinfo文件,代码处得到的后缀为jpg,能够通过对文件后缀的检测,$img_path变量为../uploads/info.php%00+随机日期.jpg,当执行move_uploaded_file函数时,服务器会对路径中%00后的内容不做解析,默认迁移文件为../uploads/web.php

结果

漏洞点:文件上传路径可控,利用%00截断

pass-12

if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传失败";}} else {$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

分析代码发现11关是get传参,本关是post传参,

二者区别

在GET请求中会对输入的内容进行URL解码。但POST请求有不同,因为在上传表单中存在一个enctype的属性,而且在enctype=”multipart/form-data”这里,是不会对表单中的数据进行解码的,需要我们将POST中的%00解码后传入。

再web.php后面的%00进行url解码

成功

pass-13

本关设计文件包含漏洞

需要上传图片马

制作图片马

copy a.png /b + 1.php /a webshell2.png

 应该包含如下内容

接着直接上传图片,然后我们通过文件包含漏洞进行解析文件。该文件包含解码通过get传参,我们复制图片地址,链接到文件包含界面,然后访问。

成功

pass-14

同13关,直接上传我们的图片马即可

pass-15

同13关

pass-16

同样,我们尝试上传图片马

发现上传成功,但是访问文件发现并没有执行我们的php脚本

查看源代码

if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromgif($target_path);if($im == false){$msg = "该文件不是gif格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".gif";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}

发现图片进行了二次渲染。

针对二次渲染,我们的方法是利用beyond compare工具,进行上传前和上传后的16进制对比,找出相同的位置插入我们的脚本代码,接着重新上传该图片。

访问图片,成功

当然,还可以尝试利用jpg和png格式的图片

pass-17

上传我们的php文件,发现上传失败

查看源代码

if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允许上传.jpg|.png|.gif类型文件!";unlink($upload_file);}}else{$msg = '上传出错!';}
}

我们发现这里存在逻辑的问题,代码中先移动文件到指定目录,才判断是否符合并删除文件。服务器处理代码时总会存在一定的时间差,当我们在上传文件后就多次快速尝试访问目标文件,那么是不是有机会在删除前成功访问文件。而如果文件的代码是重新创建一个木马文件,新木马文件则永远不会被删除了!

我们的文件内容包含

<?php file_put_contents('../web.php','<?php phpinfo();?>');?>

创建的路径在上一级路径防止被删除

可以利用bp一边进行竞争,一边进行访问

访问文件

成功。

pass-18

上传图片,发现upload中没有该图片,而是在上一级目录中

我们上传图片马,然后可以利用文件包含。

成功。

pass-19

本关可以利用大小写绕过或者/.绕过

大小写绕过

直接将web.php改为web.phP

当然利用/.也可以,生成一个一句话木马的脚本改为jpg类型上传

然后bp抓包修改保存的文件名即可

修改为

查看文件

上传成功

pass-20

源代码分析

 if (file_exists(UPLOAD_PATH)) {$is_upload = false;$msg = null;if(!empty($_FILES['upload_file'])){//mime check$allow_type = array('image/jpeg','image/png','image/gif');if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上传该类型文件!";}else{//check filename$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {$file = explode('.', strtolower($file));}$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}}}}else{$msg = "请选择要上传的文件!";}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}

分析代码

empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

如果save_name为空,则把$_FILES['upload_file']['name']赋值给$file,反之$_POST['save_name']赋值给$file

if (!is_array($file)) {$file = explode('.', strtolower($file));}

如果$file不是数组,则将其处理为数组,通过.符号将其分割 [ “muma.php”,””,”jpg”]

$ext = end($file);   //文件后缀$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";
}

end()函数获得$file中的最后一个元素,赋值给$ext,并进行后缀校验

}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}

后缀符合,则拼接文件名为首元素.尾元素 reset()获取数组首元素

因此我们可以修改数组,上传php文件,后缀名改为jpg

抓包查看一下

我们需要的是web.php,可以试着将数组传为save_name=["web.php"," ","jpg"],当我们save_name[1]不设置的时候,count结果仍然是2,但是文件名后缀拼接出来为空,结果为web.php. 再根据windows特性将.省略,从而上传文件。

我们可以构造数组

------geckoformboundary55e8518e38caa5df9e9d15a4791fe8bd
Content-Disposition: form-data; name="save_name[0]"web.php------geckoformboundary55e8518e38caa5df9e9d15a4791fe8bd
Content-Disposition: form-data; name="save_name[2]"jpg

修改为如下内容

上传成功。 

访问文件

至此upload-labs靶场实验实例完成。 

相关文章:

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…...

HTTP协议(20250305)

1. 万维网 WWW(World Wide Web)世界范围内的&#xff0c;联机式的信息储藏所&#xff0c;万维网解决了获取互联网上的数据时需要解决的以下问题&#xff1a; 怎样标识分布在整个互联网上的文档 URL用什么样的协议实现万维网上的各种链接 HTTP怎么使用户能够方便的查看文档数…...

Qt中txt文件输出为PDF格式

main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...

《大语言模型的原理发展与应用》:此文为AI自动生成

《大语言模型的原理发展与应用》&#xff1a;此文为AI自动生成 一、引言&#xff1a;大语言模型&#xff0c;AI 时代的 “新引擎” 在当今数字化浪潮中&#xff0c;大语言模型宛如一颗璀璨的明星&#xff0c;照亮了人工智能发展的道路&#xff0c;成为推动各领域变革的核心驱…...

FPGA 高速接口Aurora8B/10B 协议详解与仿真

FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议&#xff0c;通常用于 FPGA 设计和其他数字通信应用。即一种编码方案&#xff0c;旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…...

大白话Vue 源码

大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”&#xff0c;它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”&#xff0c;分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子&#xff0c;下面咱一个一个…...

grpc工具使用

工具安装 protoc 访问protoc release&#xff0c;根据系统型号&#xff0c;下载对应版本的protoc工具&#xff0c;并将下载到的可执行文件存放于$path中 安装完成后&#xff0c;可通过protoc --version指令校验是否安装成功 protoc --version # 输出&#xff1a; # libprotoc…...

ESP8266连接网络实时上传数据

要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…...

定制化开发的WooCommerce独立站商城更安全

定制化开发的WooCommerce独立站商城在安全性、交易风险控制以及整体用户体验方面有显著优势。以下是定制化开发在这些方面的具体表现&#xff1a; 1. 安全性更高 定制化开发允许开发者从底层架构开始设计和优化&#xff0c;确保网站的安全性。以下是具体表现&#xff1a; (1…...

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…...

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…...

安全渗透测试的全面解析与实践

引言 随着网络安全威胁的日益增加&#xff0c;企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试&#xff08;Penetration Testing&#xff0c;简称渗透测试&#xff09;作为主动发现和修复系统安全漏洞的重要手段&#xff0c;已成为安全防护体系中的关键环节。本文…...

关联封号率降70%!2025最新IP隔离方案实操手册

高效运营安全防护&#xff0c;跨境卖家必看的风险规避指南 跨境账号管理的核心挑战&#xff1a;关联封号风险激增 2024年&#xff0c;随着全球电商平台对账号合规的审查日益严苛&#xff0c;“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...

【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解

摘要 本文分类使用的是resNet34,什么不用yolo v8&#xff0c;yolo v10系列,虽然他们也可以分类&#xff0c;因为yolo系列模型不纯粹&#xff0c;里面包含了目标检测的架构&#xff0c;所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…...

【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁

在 Java 的 I/O 操作中&#xff0c;字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写&#xff0c;适合处理二进制数据&#xff08;如图片、音频等&#xff09;&#xff1b;而字符流以字符为单位进行读写&#xff0c;适合处理文本数据。在实际开发中&#x…...

如何设置爬虫的访问频率?

设置爬虫的访问频率是确保爬虫行为合法且不给目标网站服务器造成过大压力的重要措施。合理的访问频率可以有效避免被网站封禁IP&#xff0c;同时也能保证爬虫的效率。以下是一些设置爬虫访问频率的方法和策略&#xff1a; 一、设置请求间隔 &#xff08;一&#xff09;固定间隔…...

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…...

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…...

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…...

【C++STL之vector】vector容器浅析

文章目录 &#x1f31f; 深入探索C vector&#xff1a;从青铜到王者的动态数组进阶指南 &#x1f31f;&#x1f680; 开篇&#xff1a;为什么vector是C程序员的瑞士军刀&#xff1f;&#x1f50d; 一、vector的本质解密&#xff1a;不只是智能数组那么简单1.1 动态数组的华丽蜕…...

如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?

目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#…...

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …...

Redis 的几个热点知识

前言 Redis 是一款内存级的数据库&#xff0c;凭借其卓越的性能&#xff0c;几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识&#xff0c;但其中的热点知识并不多。今天&#xff0c;『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...

Rust WebAssembly 入门教程

一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...

靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连

靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵&#xff0c;这里只有两个端口&#xff0c;感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…...

Android 中 ConstrantLayout 与 RelativeLayout 区别

ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器&#xff0c;它们都可以用于构建复杂的用户界面&#xff0c;但在功能、性能、使用方式等方面存在一些区别&#xff0c;下面为你详细介绍&#xff1a; 1. 布局原理 RelativeLayout&#xff1a;RelativeL…...

【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法

【一键筑梦】革新性2Dto3D插件&#xff0c;轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器&#xff0c;集一键式墙体、门、窗自动生成功能于一身&#xff0c;能够将2D图形无缝转化为3D网格对象&#xff08;3D平面图、鸟瞰图&#xff09;&#xff0c;一…...

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…...