upload-Labs靶场“11-15”关通关教程

君衍.

  • 一、第十一关 %00截断GET上传
    • 1、源码分析
    • 2、%00截断GET上传
  • 二、第十二关 %00截断POST上传
    • 1、源码分析
    • 2、%00截断POST上传
  • 三、第十三关 文件头检测绕过
    • 1、源码分析
    • 2、文件头检测绕过
  • 四、第十四关 图片检测绕过上传
    • 1、源码分析
    • 2、图片马绕过上传
  • 五、第十五关 图片检测绕过上传
    • 1、源码分析
    • 2、图片马绕过上传

upload-Labs靶场“1-5”关通关教程

一、第十一关 %00截断GET上传

1、源码分析

$is_upload = false;
$msg = null;
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类型文件!";}
}

添加注释解读:

$is_upload = false;
$msg = null;
# 检查是否有名为 submit 的表单提交
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,使用 rand(10, 99) 生成两位随机数和当前日期时间$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;# 使用 move_uploaded_file($temp_file, $img_path) 将上传的文件移动到目标路径if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是
$_GET['save_path']服务器接受客户端的值,这个值可被客户端修改。

2、%00截断GET上传

这里我们便将上传参数更改:
在这里插入图片描述
在这里插入图片描述
更改掉之后就会将1.jpg覆盖给1.php通过%00进行截断,即为1.php%001.jpg变为1.php:
在这里插入图片描述
然后访问执行即可。

二、第十二关 %00截断POST上传

1、源码分析

$is_upload = false;
$msg = null;
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类型文件!";}
}

添加注释解读代码:

$is_upload = false;
$msg = null;
# 检查是否有名为 submit 的表单提交
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,使用 rand(10, 99) 生成两位随机数和当前日期时间$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;# 这里使用 $_POST['save_path'] 构建目标文件路径,而不是之前的 $_GET['save_path']# 将上传的文件移动到目标路径if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传失败";}} else {$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

这段代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。所以会产生安全漏洞。

2、%00截断POST上传

这里我们同十一关一样,通过抓包修改参数,使用%00进行截断文件名,在GET传参中是可以使用的,但是这里是POST,所以我们使用decode编码:
在这里插入图片描述
将%00进行编码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到这里上传成功,然后我们访问图像链接来执行:
在这里插入图片描述
即可完成上传。

三、第十三关 文件头检测绕过

1、源码分析

function getReailFileType($filename){$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin);    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    $fileType = '';    switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

添加注释解读以上代码:

# 用于获取文件的真实类型
function getReailFileType($filename){# 打开文件并读取前两个字节$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);# 使用 unpack 函数将二进制数据解析为数组 $strInfo# 每个字节被解析为一个无符号字符(C),总共解析两个字节$strInfo = @unpack("C2chars", $bin);  # 将解析后的两个字节拼接成一个整数,存储在 $typeCode 中$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    # 初始化变量 $fileType 为空字符串$fileType = '';# 根据 $typeCode 的值执行不同的操作    switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}$is_upload = false;
$msg = null;
# 检查是否接收到名为 submit 的 POST 请求
if(isset($_POST['submit'])){# 获取上传文件的临时文件路径$temp_file = $_FILES['upload_file']['tmp_name'];# 调用之前定义的 getReailFileType 函数获取上传文件的真实类型$file_type = getReailFileType($temp_file);# 检查文件类型是否为 'unknown'if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{# 构建目标文件路径,包括上传路径、随机生成的文件名和文件扩展名$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;# 将临时文件移动到目标路径if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测 它检测图片是两个字节的长度,如果不是图片的格式,会禁止上传。

常见的文件头
 JPEG (jpg),文件头:FFD8FF
 PNG (png),文件头:89504E47
 GIF (gif),文件头:47494638
 TIFF (tif),文件头:49492A00
 Windows Bitmap (bmp),文件头:424D

在这里插入图片描述

2、文件头检测绕过

首先我们创建图片马:

copy 1.gif/b+1.php shell.gif
copy 图片文件/b + 敏感文本文件 web.jpg

将 php 文件附加在gif图片上,直接上传即可
在这里插入图片描述
直接上传这里利用文件包含漏洞来执行:
在这里插入图片描述
复制文件链接,然后利用文件上传漏洞访问执行:

http://192.168.217.130/up/include.php?file=http://192.168.217.130/up/upload/1620240301170724.gif

在这里插入图片描述

我们即可看到执行成功。
当然,我们也可以直接加上GIF89a
我们上传一个木马,同时进行抓包:
在这里插入图片描述
在这里插入图片描述
改为:
在这里插入图片描述
放通后进行访问执行:
在这里插入图片描述
即可看到执行成功。

四、第十四关 图片检测绕过上传

1、源码分析

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;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

使用注释解读代码:

# 检查文件是否为图片
function isImage($filename){# 定义了允许上传的图片文件类型$types = '.jpeg|.png|.gif';# 检查指定的文件是否存在if(file_exists($filename)){# 获取文件的基本信息,包括图片的宽度、高度以及图像类型等$info = getimagesize($filename);# 将图像类型转换为对应的文件扩展名$ext = image_type_to_extension($info[2]);# 用 stripos 函数检查文件扩展名是否在允许的类型列表中if(stripos($types,$ext)>=0){return $ext;}else{return false;}}else{return false;}
}$is_upload = false;
$msg = null;
# 检查是否接收到名为 submit 的 POST 请求
if(isset($_POST['submit'])){# 获取上传文件的临时文件路径$temp_file = $_FILES['upload_file']['tmp_name'];# 调用 isImage 函数检查上传文件是否为图片$res = isImage($temp_file);# 如果上传文件不是图片输出if(!$res){$msg = "文件未知,上传失败!";}else{# 构建目标文件路径,包括上传路径、随机生成的文件名和文件扩展名$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;# 将临时文件移动到目标路径if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

2、图片马绕过上传

源码中使用getimagesize来获取图片的大小,如果头文件不是图片直接报错,所以我们可以直接使用图片马绕过检测。
在这里插入图片描述
然后直接使用文件包含漏洞访问执行:
在这里插入图片描述
即可看到成功上传并执行。

五、第十五关 图片检测绕过上传

1、源码分析

function isImage($filename){//需要开启php_exif模块$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break;    default:return false;break;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

添加注释解读以上代码:

function isImage($filename){// 需要开启php_exif模块$image_type = exif_imagetype($filename); // 获取图片的类型switch ($image_type) { // 根据图片类型执行不同的操作case IMAGETYPE_GIF:return "gif"; // 如果是 GIF 类型的图片,返回 "gif"break;case IMAGETYPE_JPEG:return "jpg"; // 如果是 JPEG 类型的图片,返回 "jpg"break;case IMAGETYPE_PNG:return "png"; // 如果是 PNG 类型的图片,返回 "png"break;    default:return false; // 如果不是上述类型的图片,则返回 falsebreak;}
}$is_upload = false; // 初始化变量,用于表示文件是否上传成功,默认为 false
$msg = null; // 初始化变量,用于存储错误消息,默认为 nullif(isset($_POST['submit'])){ // 检查是否接收到名为 'submit' 的 POST 请求,表示用户提交了表单$temp_file = $_FILES['upload_file']['tmp_name']; // 获取上传文件的临时文件路径$res = isImage($temp_file); // 调用 isImage 函数检查上传文件是否为图片if(!$res){ // 如果上传文件不是图片,则执行以下操作$msg = "文件未知,上传失败!"; // 将错误消息设置为 "文件未知,上传失败!"}else{ // 如果上传文件是图片,则执行以下操作$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res; // 构建目标文件路径,包括上传路径、随机生成的文件名和文件扩展名if(move_uploaded_file($temp_file,$img_path)){ // 将临时文件移动到目标路径,如果移动成功,则执行以下操作$is_upload = true; // 设置文件上传状态为完成} else { // 如果移动文件失败,则执行以下操作$msg = "上传出错!"; // 将错误消息设置为 "上传出错!"}}
}

2、图片马绕过上传

第十五关同样进行判断是否为图片,所以同十四关相同:
在这里插入图片描述
然后直接使用文件包含漏洞访问执行:
在这里插入图片描述
即可看到成功上传并执行。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql学习笔记8——常用5个内置方法

1count 对查询内容进行计数,并返回结果 2as as可以将查询出来结果赋予新名字 3sum sum可以查询某字段特定条件下的和值 4concat concat可以将多列数据合并成一列,只要concat()即可 5group_concat group_concat可以把多列…

Docker的镜像操作

目录 镜像的操作(**开头为常用请留意) 镜像查找 **拉取镜像 **推送镜像 **查看镜像 **修改镜像名称 **查看镜像的详细信息 ​编辑 删除镜像 查看所有镜像ID 删除全部镜像 **查看镜像的操作历史 镜像迁移 镜像打包 远程发送镜像(需要先打包) 本地镜像tar包恢复 镜像过…

【YOLO v5 v7 v8 v9小目标改进】辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题

辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题 设计思路结构小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 论文:https://arxiv.org/pdf/2202.06934.pdf 代码:https://github.com/obss/sahi 设计思…

文件MD5校验码的安全性及重要性

title: 文件MD5校验码的安全性及重要性 date: 2024/3/6 18:13:20 updated: 2024/3/6 18:13:20 tags: MD5原理文件校验下载验证数据库一致性安全性保障计算方法MD5安全防护 文件MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于验证…

基于OpenCV的图形分析辨认04

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言:Python,编程软件:vscode或pycharm,必备的第三方库:OpenCV,numpy,matplotlib,os等等。 关于OpenCV&…

SqlServer中连续号及断号查询—附源码

效果如下图所示: SqlServer中连续号及断号查询SQL如下: --1.定义临时表 DECLARE TestTemp TABLE(TestCode NVARCHAR(50),TestNum INT )DECLARE DataTemp TABLE(TestCode NVARCHAR(50),TestNumStr NVARCHAR(100) )--2.插入测试数据 INSERT INTO TestT…

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

基于Java的校园失物招领管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系统公告模块2.4 感谢留言模块 三、界面展示3.1 登录注册3.2 招领模块3.3 寻物模块3.4 公告模块3.5 感谢留言模块3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 校园失物招领…

Cyber RT 开发工具

在Cyber RT中还提供了一些工具&#xff0c;这些工具可以拓展Cyber RT功能、提高开发调试效率&#xff0c;本章主要介绍这些工具的使用。 本章内容: 1.cyber record工具的应用&#xff1b; 2.常用命令工具的使用&#xff1b; 学习收获: 1.可以通过cyber record将发布的话题消息…

因果学习篇(2)-Causal Attention for Vision-Language Tasks(文献阅读)

Causal Attention for Vision-Language Tasks 引言 这篇论文是南洋理工大学和澳大利亚莫纳什大学联合发表自2021年的CVPR顶会上的一篇文献&#xff0c;在当前流行的注意力机制中增加了因果推理算法&#xff0c;提出了一种新的注意力机制&#xff1a;因果注意力(CATT)&#xff…

AI智商排名:Claude-3首次突破100

用挪威门萨&#xff08;智商测试题&#xff09;中 35 个问题对chatGPT等人工智能进行了测试&#xff1a; ChatGPT 对ChatGPT进行了两次挪威门萨测试&#xff0c;在 35 个问题中&#xff0c;它平均答对了 13 个&#xff0c;智商估计为 85。 测试方法 每个人工智能都接受了两次…

2023第十届GIAC全球互联网架构大会:洞察未来互联网架构的革新与突破(附大会核心PPT下载)

随着互联网的迅猛发展&#xff0c;其底层架构的演进与革新成为了推动全球数字化进程的关键力量。2023年第十届GIAC全球互联网架构大会如期而至&#xff0c;汇聚了全球互联网架构领域的顶尖专家、学者、企业领袖和创新者&#xff0c;共同探讨和展望互联网架构的未来发展趋势。本…

RabbitMQ 基本介绍

RabbitMQ 基本介绍 消息模型 所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后…

centos7安装maven离线安装

1、从官方网站下载maven文件包 官方下载网站&#xff1a;https://maven.apache.org/download.cgi 2、创建文件夹解压文件 将下载好的安装包&#xff0c;放到创建的目录下&#xff0c;并解压 a、创建/app/maven文件 mkdir /app/mavenb、解压文件 tar -zxvf apache-maven-…

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…

32、Redis 7系列:Spring Boot集成Redis

32、Redis 7系列&#xff1a;Spring Boot集成Redis 一、前言二、集成 RedisTemplate1、单机&#xff08;1&#xff09;新建项目&#xff08;2&#xff09;修改pom文件&#xff08;3&#xff09;修改yml文件&#xff08;4&#xff09;启动类&#xff08;5&#xff09;配置类&…

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

centos7 部署kibana

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 这里使用elk101服务器安装kibana 下载rpm包(这里添加了-c参数用到wget的断点续传功能) #下载kibana-rpm包以及校验文件 wget -c https://artifacts.elastic.co/downloads/kibana/kibana-7.17.18-x86_64.rpm wget -c htt…

尤雨溪:Vue 未来展望新的一轮

十年&#xff0c;一个既漫长又短暂的时光跨度&#xff0c;对于技术世界来说&#xff0c;更是沧海桑田的瞬间。在这十年里&#xff0c;Vue.js 从无到有&#xff0c;从默默无闻到蜚声全球&#xff0c;不仅改变了前端开发的面貌&#xff0c;更成为了无数开发者手中的得力工具。 在…

设计模式之策略模式实践

设计模式之策略模式实践 先了解一下策略模式的定义是什么&#xff1f;解决什么问题 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装成一个类&#xff0c;并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个&a…