Upload-labs(1-20关保姆级教程)

靶场下载链接
https://github.com/c0ny1/upload-labs
话不多说,直接喂饭
lab-1
上传php木马,发现弹出提示框,查看源码可知是前端过滤
bp抓包,先上传一张正常的jpg图片

修改文件内容和后缀,大概就是想怎么改就怎么改的样子
比如这样

拿下

然后蚁剑连接图片(在图片处右击,即可获得图片位置)
lab-2
第二关修改 Content-Type为 image/jpeg

tips:MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。image/jpeg
lab-3
修改.php后缀

php跟phtml的关系
PHP(Hypertext Preprocessor)是一种通用的开源脚本语言,用于服务器端的Web开发。它可以嵌入到HTML中,通过服务器端的解析运行来生成动态的Web页面。
PHTML(PHP HTML)是一种特定于PHP的文件扩展名,它表示包含PHP代码的HTML文件。实际上,PHTML文件本质上是HTML文件,但可以在其中嵌入PHP代码,使页面具有动态功能。
因此,PHTML文件本质上是PHP文件的一种变体,用于在HTML文件中嵌入PHP代码和逻辑。这样,开发人员可以使用PHP的强大功能来处理表单数据、数据库连接和其他服务器端操作,同时保持页面的结构和样式。
lab-4
把所有不符合的后缀都过滤了

.htaccess作用
.htaccess(Hypertext Access)是一个在 Apache Web 服务器上使用的配置文件,用于控制和定制Web服务器的行为。它是一个纯文本文件,通常位于网站的根目录中。
.htaccess 文件的作用很多,下面列举几个常见的应用场景:
1. 重定向和URL重写:可以使用.htaccess 文件来设置 URL 重写规则,将不同的 URL 请求重定向到指定的页面或修改 URL 结构。比如,可以将动态的 URL 修改为更友好更易读的静态 URL。
2. 访问控制:通过.htaccess 文件,可以限制特定目录或文件的访问权限。可以设置密码保护目录,仅允许授权用户访问。
3. MIME 类型设置:.htaccess 文件还可以设置文件的 MIME 类型,指示服务器如何解释和处理不同类型的文件。
4. 缓存控制:通过.htaccess 文件,可以配置网页的缓存策略,以优化网站的加载速度和减少服务器负载。
5. 错误处理:可通过.htaccess 文件自定义错误页面,当服务器发生错误时,将会显示自定义的错误页面,提供更友好的用户体验。

简单来说,就是让服务器在解析文件的时候,.htaccess文件所在目录下,全部以php文件解析

lab-5
和第四关一样,并且加上了.htaccess,但是没有将后缀进行大小写统一,于是可以通过大小写绕过

lab-6
黑名单过滤,对比第五关发现没有对后缀名进行去空处理,可在后缀名中加空格绕过


lab-7
查看源码发现没有对后缀名进行去”.”处理。通常情况下,当访问一个网址时,Web服务器会尝试解析URL中的路径,并根据设置的规则去寻找对应的文件。而在解析文件路径时,Web服务器会自动去掉文件后缀名中最后的点"."。可在后缀名中加”.”绕过

lab-8
对比前几关发现还是黑名单,但是没有对后缀名进行去“::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过

lab-9
对比前面的几关,路径拼接的是处理后的文件名,于是构造info.php. . (点+空格+点),经过处理后,文件名变info.php.,即可绕过



lab-10
审计源码,发现第十关是将后缀名替换为空,于是可以利用双写进行绕过

连接一句话木马

lab-11
审计一下源码,发现为白名单过滤


$img_path直接拼接,因此可以利用%00截断绕过

%00截断
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。
字符串截断攻击是利用输入验证或处理中的漏洞,通过插入特定的字符来截断字符串,改变原本的逻辑或绕过限制。当 %00 字符被插入到字符串中时,它会被用作字符串的终止字符,导致后续的内容被忽略。
tips:
php环境中截断条件:
1.php版本小于5.3.4 详情关注CVE-2006-7243
2.php的magic_quotes_gpc为OFF状态,便会有00截断,利用00截断上传。
lab-12
和十一关不同的是这次的save_path是通过post传进来的,还是利用00截断,但这次需要主动解码,因为post不会像get对%00进行自动解码。

然后就会消失了

lab-13
图片马
图片马制作比较简单,需要一张图片, 一个php文件。
通过copy将图片和php文件组合在一起。
使用cmd执行如下命令
copy 123.jpg /b + shell.php /a shell.jpg

tips:图片在前,php代码在后,先/b后/a ,顺序颠倒就不成功了


lab-14
这关和lab-13一样,只需要上传图片马即可。
函数的作用:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的。
lab-15
以利用图片马就可进行绕过
exif_imagetype() 读取一个图像的第一个字节并检查其签名.本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上和$_SERVER[‘HTTP_ACCEPT’] 结合使用来检查浏览器是否可以显示某个指定的图像。
lab-16
本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,绕过方法

上传上去发现里面的一句话木马被渲染了
试试其他的写入方法

二次渲染
二次渲染就是根据用户上传的照片,新生成一个照片,删除原始照片,将新照片添加到数据库中。比如一些网站将用户上传的头像生成大中小的图像,在二次渲染中,我们在图片中写的木马也会渲染掉。
lab-17
条件竞争
文件先保存在upload文件夹下,然后再判断是否合法,若合法则进行重命名,否则调用unlink函数删除非法文件。


审计代码发现存在条件竞争问题,非法文件上传后会先保存在upload目录下,然后调用unlink函数删除,在这中间时间差里,我们通过不断上传和访问非法文件,只要速度快就可以触发成功。
- 先设置上传shell.php请求,burp拦截到上传文件后发送到爆破模块,因为这里没有参数需要爆破,只需反复发起请求即可,所以payload设置为null payloads,请求次数为6000次,线程为50.
- 接下来设置访问请求,浏览器构造请求url://http://192.168.10.136/upload-labs/upload/info.php,进行访问,发送到burp的爆破模块、6000次请求次数、50个线程。
- 同时开始攻击,观察第二个请求返回的长度,长度不一样的则成功。
这里的第二个攻击也可以利用脚本实现:
import requests
url = "http://192.168.1.106/upload-labs/upload/info.php"
while True:html = requests.get(url)if html.status_code == 200:print("OK")break
最后直接变为病毒库

lab-18
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{require_once("./myupload.php");$imgFileName =time();$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);$status_code = $u->upload(UPLOAD_PATH);switch ($status_code) {case 1:$is_upload = true;$img_path = $u->cls_upload_dir . $u->cls_file_rename_to;break;case 2:$msg = '文件已经被上传,但没有重命名。';break; case -1:$msg = '这个文件不能上传到服务器的临时文件存储目录。';break; case -2:$msg = '上传失败,上传目录不可写。';break; case -3:$msg = '上传失败,无法上传该类型文件。';break; case -4:$msg = '上传失败,上传的文件过大。';break; case -5:$msg = '上传失败,服务器已经存在相同名称文件。';break; case -6:$msg = '文件无法上传,文件不能复制到目标目录。';break; default:$msg = '未知错误!';break;}
}//myupload.php
class MyUpload{
......
......
...... var $cls_arr_ext_accepted = array(".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",".html", ".xml", ".tiff", ".jpeg", ".png" );......
......
...... /** upload()**** Method to upload the file.** This is the only method to call outside the class.** @para String name of directory we upload to** @returns void**/function upload( $dir ){$ret = $this->isUploadedFile();if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->setDir( $dir );if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->checkExtension();if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->checkSize();if( $ret != 1 ){return $this->resultUpload( $ret ); }// if flag to check if the file exists is set to 1if( $this->cls_file_exists == 1 ){$ret = $this->checkFileExists();if( $ret != 1 ){return $this->resultUpload( $ret ); }}// if we are here, we are ready to move the file to destination$ret = $this->move();if( $ret != 1 ){return $this->resultUpload( $ret ); }// check if we need to rename the fileif( $this->cls_rename_file == 1 ){$ret = $this->renameFile();if( $ret != 1 ){return $this->resultUpload( $ret ); }}// if we are here, everything worked as planned :)return $this->resultUpload( "SUCCESS" );}
......
......
......
};
这关的myupload.php中保存上传文件路径的代码其实是有点问题的,setDir函数里$this->cls_upload_dir = $dir;应该加上’/’,改为$this->cls_upload_dir = $dir.'/';,不然保存的图片只会保存在根目录下,不会保存在upload目录下。
本关和lab-17一样存在条件竞争漏洞,关键函数move、renameFile,先将上传文件保存到upload目录下,再进行重命名,只不过在move之前进行了checkExtension白名单过滤,不能上传php文件进行文件包含来getshell了。幸运的是白名单里有zip、7z、rar等Apache不能解析的后缀名,所以我们可以利用条件竞争+解析漏洞来绕过。 绕过方法: 和上一关一样,上传并访问info.php.7z
lab-19

这关比较简单,pathinfo()返回一个关联数组包含有$file_name的信息,第二个参数PATHINFO_EXTENSION决定了返回后缀名。从我们自定义的文件名save_name中取出后缀名,与黑名单比较,最后与上传目录拼接起来变为上传路径。

绕过方法:
靶机为Windows:
- 空格绕过
- ::$DATA绕过
- 点绕过
- 0x00截断
- 大小写绕过
- Apache解析漏洞绕过
- /.绕过
tips:move_uploaded_file()会忽略掉文件末尾的/.,所以可以构造save_path=1.php/.,这样file_ext值就为空,就能绕过黑名单,而move_uploaded_file()函数忽略文件末尾的/.可以实现保存文件为.php。
靶机为linux:
- 0x00截断绕过
- /.绕过
lab-20

explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组,这里是用 . 将文件名打散,并返回数组。 reset() 函数把数组的内部指针指向第一个元素,并返回这个元素的值。 end() 函数将数组内部指针指向最后一个元素,并返回该元素的值(如果成功)。
函数执行流程:文件名通过POST方法提交->MIME白名单校验->后缀名白名单校验->获取文件名并拼接后缀名,构成上传路径 关键:is_array函数判断文件名save_name是否是数组,若不是则用explode函数以.来打散成数组,end函数获取文件后缀、reset获取文件名,最后f i l e [ c o u n t ( file[count(file[count(file) - 1]拼接上最后一个文件后缀=>构成上传路径。

绕过方法: 这里可以构造save_name[0] = info.php/,save_name[2] = jpg,这样数组的长度为2,save_name[1] = null,所以最终file_name=info.php/.,到这里就构成了19题中的/.绕过。
0x00截断绕过,不过php版本要低于5.3.4
参考链接:upload-labs_拓海AE的博客-CSDN博客
相关文章:
Upload-labs(1-20关保姆级教程)
靶场下载链接 https://github.com/c0ny1/upload-labs 话不多说,直接喂饭 lab-1 上传php木马,发现弹出提示框,查看源码可知是前端过滤 bp抓包,先上传一张正常的jpg图片 修改文件内容和后缀,大概就是想怎么改就怎么…...
C语言实现调整数组中奇数偶数顺序
目录 1.思路2. 代码 1.思路 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置循环进行一下操作 a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环 b. left从前往后找&#…...
从车窗升降一探 Android 车机的重要 API:车辆属性 CarProperty
前言 前面我们介绍过 Android 车机 Automotive OS 的几块重要内容: 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车机的自定义事件机制深度入门 Android 车机核心 CarService 的构成和链路 本篇文章我们聚焦 Android 车机上最重要、最常用…...
Unity读取写入Excel
1.在Plugins中放入dll,118开头的dll在Unity安装目录下(C:\Program Files\Unity\Editor\Data\Mono\lib\mono\unity) 2.写Excel public void WriteExcel(){//文件地址FileInfo newFile new FileInfo(Application.dataPath "/test.xlsx…...
手搭手Ajax经典基础案例省市联动
环境介绍 技术栈 springbootmybatis-plusmysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…...
分类预测 | MATLAB实现SSA-CNN-BiLSTM-Attention数据分类预测(SE注意力机制)
分类预测 | MATLAB实现SSA-CNN-BiLSTM-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MAT…...
Springboot后端开发_日志
SpringBoot_日志 简介1、日志框架2、SLF4j使用1、如何在系统中使用SLF4j https://www.slf4j.org2、遗留问题 3、SpringBoot日志关系4、日志使用1、默认配置2、指定配置 5、切换日志框架拓展:日志分组 简介 6 种日志级别 TRACE: designates finer-grained informat…...
Unable to connect to the server: x509: certificate is valid for问题解决
文章目录 环境描述问题描述问题原因解决方案额外问题问题描述问题解决方案新问题 环境描述 Kubernetes版本1.15测试客户端centos7 问题描述 将构建于内网网络环境上的kubernetes集群的/etc/kubernetes/admin.conf文件拷贝到外网的一台装有kubernetes客户端的设备上ÿ…...
使用vite搭建前端项目
1、在vscode 终端那里执行创建前端工程项目,其中shop-admin为项目名称: npm init vite-app shop-admin 提示如需安装其他依赖执行npm install ....,否则忽略(第三步再讲)。 2、执行npm run dev 命令直接运行创建好的项目,在浏览器打开链接…...
leetcode1658. 将 x 减到 0 的最小操作数
题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode) 知道滑动窗口,代码却写不出来 #define MIN(a ,b) ((a) < (b) ? (a) : (b))int minOperations(int* nums, int numsSize, int x) {int ans INT_MAX;int sum 0;f…...
Jenkins 重新定义 pom 内容,打包
文章目录 源码管理构建 源码管理 添加仓库地址,拉取凭证,选择需要的分支 构建 勾选 构建环境 下删除原始 build 配置,防止文件错误 Pre Steps 构建前处理 pom.xml ,例如我是需要删除该模块的所有子模块配置,我这里…...
自然语言处理---Transformer构建语言模型
语言模型概述 以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出一个在所有词汇上的概率分布,这样的模型称为语言模型。 # 语言模型的训练语料一般来自于文章,对应的源文本和目标文本形如: src1 "I can do&…...
【WPF】对Image元素进行缩放平移等操作
元素布局 <Border Grid.Row"1" Name"border" ClipToBounds"True" Margin"10,10,10,10"><Image Name"image" Visibility"Visible" Margin"3,3,3,3" Grid.Column"1" Source"{Bin…...
JavaScript中Bom节点和表单的获取值
Bom节点 代表浏览器对象模型(Browser Object Model),它是浏览器提供的 JavaScript API,用于与浏览器窗口和浏览器本身进行交互 获取当前网页的URL: const currentURL window.location.href; console.log(currentURL…...
RDB.js:适用于 Node.js 和 Typescript 的终极对象关系映射器
RDB.js 是适用于 Node.js 和 Typescript 的终极对象关系映射器,可与 Postgres、MS SQL、MySQL、Sybase SAP 和 SQLite 等流行数据库无缝集成。无论您是使用 TypeScript 还是 JavaScript(包括 CommonJS 和 ECMAScript)构建应用程序,…...
ROI的投入产出比是什么?
ROI的投入产出比是什么? 投入产出比(Return on Investment, ROI)是一种评估投资效益的财务指标,用于衡量投资带来的回报与投入成本之间的关系。它的计算公式如下: 投资收益:指的是投资带来的净收入&#x…...
Linux打包发布常用命令
1、先下载一个FileZilla Client远程连接工具,并连接我们需要连接的服务器 2、进入xshell连接对应的服务器,连接后若不知道项目位置,可使用此命令查看 ps -ef | grep java 此时会出现一大串代码,找到以我这为例:root…...
Docker Swarm 节点维护
Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker,所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager,或 manager 降级为 worke…...
AS/NZS 1859.3:2017 木基装饰板检测
木基装饰板是指以木质材料为基材,比如刨花板,胶合板等木质人造板,表面贴有PVC膜,三聚氰胺纸,木饰面等装饰层压制而成的木质复合材料,主要用于墙面装饰,家具等领域。 AS/NZS 1859.3:…...
深入理解算法:从基础到实践
深入理解算法:从基础到实践 1. 算法的定义2. 算法的特性3. 算法的分类按解决问题的性质分类:按算法的设计思路分类: 4. 算法分析5. 算法示例a. 搜索算法示例:二分搜索b. 排序算法示例:快速排序c. 动态规划示例…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
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…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...



