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.mzph.cn/news/724863.shtml

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

相关文章

华中某科技大学校园网疑似dns劫持的解决方法

问题 在校园网ping xxx.ddns.net,域名解析失败 使用热点ping xxx.ddns.net,可以ping通 尝试设置windows dns首选dns为114.114.114.114,重新ping,仍然域名解析失败 猜测【校园网可能劫持dns请求】 解决方法 使用加密的dns请求…

[LeetBook]【学习日记】有效数字——状态机

题目 有效数字 有效数字(按顺序)可以分成以下几个部分: 若干空格一个小数或者整数(可选)一个’e’或’E’,后面跟着一个整数若干空格 小数(按顺序)可以分成以下几个部分&#xff1a…

【考研数学】基础660太难了?一个办法搞定660

觉得题目太难,大概率是题目超出了自己当前的水平 题型没见过,或者太复杂,属于跳级学习了,正确的思路就是回归到自己的水平线,题目略难即可。 这样做题的话,大部分题目涉及的点不会超出自己的能力范围&…

数据结构(七)——线性表的基本操作

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

vue3学习(续篇)

vue3学习(续篇) 默认有vue3基础并有一定python编程经验。 chrome浏览器安装vue.js devtools拓展。 文章目录 vue3学习(续篇)1. element-ui使用2. axios 网络请求1. 简介2. 操作 3. flask-cors解决跨域问题1. 简介2. 操作 4. 前端路由 vue-router1. 简单使用2. 配置路径别名和…

好利来做宠物蛋糕,为啥品牌争相入局宠物赛道?

2月20日,好利来宣布推出宠物烘焙品牌「Holiland Pet」,正式进军宠物烘焙市场。作为首个入局宠物烘焙领域的国内食品品牌,一经推出,就面临着各种争议,不管大众看法如何,好利来进军宠物市场,也让宠…

后台组件-语言包

<groupId>org.qlm</groupId><artifactId>qlm-language</artifactId><version>1.0-SNAPSHOT</version> 平台提供多语言支持&#xff0c;以上为语言包&#xff0c;提供后台多语言支持。首批实现&#xff1a; public class LanguageConstan…

Git快速上手二

对Git命令的深入理解快速上手Git&#xff08;包含提交至GitHub和Gitee&#xff09;-CSDN博客 1.5 分支操作 1.5.1 分支原理 系统上线后,又要修改bug,又要开发新的功能。 由于新功能没有开发完,所以需要建立分支,一边修改bug,一边开发新功能,最终合并. 1.5.2 分支实操 创建…

Java基于微信小程序的旅游出行必备小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

第三百八十六回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容固定显示…

18.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据与消息配置的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;17.数据分析工具配置功能的实现 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan…

于建筑外窗遮阳系数测试的太阳光模拟器模拟太阳光照射房屋视频

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景&#xff0c;帮助建筑师和设计师更好地了解建筑外窗的遮阳性能&#xff0c;从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单&#xff0c;它通过使用高亮度的光源和精密…

Positional Encoding 位置编码

Positional Encoding 位置编码 flyfish Transformer模型没有使用循环神经网络&#xff0c;无法从序列中学习到位置信息&#xff0c;并且它是并行结构&#xff0c;不是按位置来处理序列的&#xff0c;所以为输入序列加入了位置编码&#xff0c;将每个词的位置加入到了词向量中…

Netty之WebSocket协议开发

一、WebSocket产生背景 在传统的Web通信中&#xff0c;浏览器是基于请求--响应模式。这种方式的缺点是&#xff0c;浏览器必须始终主动发起请求才能获取更新的数据&#xff0c;而且每次请求都需要经过HTTP的握手和头部信息的传输&#xff0c;造成了较大的网络开销。如果客户端…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言&#xff1a; 相信大家在pyq都被这张图片刷屏了把~ 昨天&#xff0c;为大家介绍了一下什么是Claude&#xff0c;今天咱终于弄到号了&#xff08;再被ban了3个号之后终于是成功的登上去了&#xff0c;如果各位看官觉得咱文章写的不错&#xff0c;麻烦点个小小的关注~你们的…

【详识C语言】自定义类型之三:联合

本章重点 联合 联合类型的定义 联合的特点 联合大小的计算 联合&#xff08;共用体&#xff09; 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09;…

mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示

文章目录 问题描述解决方案 问题描述 如下如所示&#xff1a; 表一&#xff1a;wechat_dynamically_config表&#xff0c;重点字段&#xff1a;wechat_object 表二&#xff1a;wechat_object表&#xff0c;重点字段&#xff1a;wxid 需求&#xff1a;根据wechat_dynamically_…

模仿Gitee实现站外链接跳转时进行确认

概述 如Gitee等网站&#xff0c;在有外部链接的时候如果不是同域则会出现一个确认页面。本文就带你看看这个功能应该如何实现。 效果 实现 1. 实现思路 将打开链接作为参数传递给一个中间页面&#xff0c;在页面加载的时候判断链接的域名和当前网站是否同域&#xff0c;同域…

Redis线程模型解析

引言 Redis是一个高性能的键值对&#xff08;key-value&#xff09;内存数据库&#xff0c;以其卓越的读写速度和灵活的数据类型而广受欢迎。在Redis 6.0之前的版本中&#xff0c;它采用的是一种独特的单线程模型来处理客户端的请求。尽管单线程在概念上似乎限制了其扩展性和并…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…