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

news2024/11/18 6:25:22

君衍.

  • 一、第十一关 %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; // 如果不是上述类型的图片,则返回 false
            break;
    }
}

$is_upload = false; // 初始化变量,用于表示文件是否上传成功,默认为 false
$msg = null; // 初始化变量,用于存储错误消息,默认为 null

if(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.coloradmin.cn/o/1492404.html

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

相关文章

CSS的标准文档流,web后端开发框架

了解校招 知己知彼才能百战百胜,在准备校招之前,我们先要了解校招。 什么是校招? 校招,全称校园招聘,指企业招聘那些即将毕业的学生。校招主要分为三个部分:简历筛选,笔试,面试。 …

MATLAB环境下基于LSTM模型的癫痫发作检测方法

癫痫预测研究是利用脑电信号对癫痫发病过程做出及时的预测以促进癫痫发病的防治,这一研究的重点在于充分利用癫痫发生前后人体大脑产生的脑电信号。但截至上世纪九十年代初期,医学工作者及相关领域的专家们仍然相信癫痫病的发生过程是一种突发的、毫无规…

el-dialog封装组件

父页面 <template><div><el-button type"primary" click"visible true">展示弹窗</el-button><!-- 弹窗组件 --><PlayVideo v-if"visible" :visible.syncvisible /></div> </template><sc…

Kafka数据推送配置 | 如何设置账号密码验证?

背景&#xff1a;之前资产信息用网络接口进行数据推送&#xff0c;但是接口推送需要验证而且反应较慢。Kafak中间件提供了另一种可行的数据推送方式&#xff0c;它可以进行消息队列推送&#xff0c;且反应速度快。但是Kafka需部署在公网环境&#xff0c;并进行登录验证&#xf…

笔记本小键盘怎么开?探索笔记本小键盘的奥秘

对于许多笔记本用户来说&#xff0c;小键盘&#xff08;也称为数字键盘或NumPad&#xff09;是一个不可或缺的工具&#xff0c;它为用户提供了快速输入数字和进行计算的便利。然而&#xff0c;并非所有的笔记本电脑都配备有物理小键盘&#xff0c;而且有时我们可能会发现小键盘…

对接华泰极速行情丨DolphinDB INSIGHT 插件使用教程

INSIGHT 是华泰证券依托大数据存储、实时分析等领域的技术积累&#xff0c;整合接入国内多家交易所高频行情数据&#xff0c;为投资者提供集行情接入、推送、回测、计算及分析等功能于一体的行情数据服务解决方案。基于 INSIGHT 官方提供的行情数据服务 C SDK&#xff08;TCP 版…

图像处理 mask掩膜

1&#xff0c;图像算术运算 图像的算术运算有很多种&#xff0c;比如两幅图像可以相加&#xff0c;相减&#xff0c;相乘&#xff0c;相除&#xff0c;位运算&#xff0c;平方根&#xff0c;对数&#xff0c;绝对值等&#xff1b;图像也可以放大&#xff0c;缩小&#xff0c;旋…

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建 卷II 一. 拓扑图 二.有线网络配置 三.无线网络配置 四.出口网络配置 二、有线配置 S1.txt S1#show running-config Building configuration... Current configuration : 5008 bytes! version RGOS 10…

启英泰伦「离线自然说」:让照明语音交互更自然、更便捷

随着科技的不断发展&#xff0c;智能家居已经成为现代生活的一部分。其中&#xff0c;智能照明作为智能家居的重要组成部分&#xff0c;为人们带来了更加便捷、舒适的照明体验。然而&#xff0c;传统的离线语音交互技术在智能照明领域的应用一直受到词条存储量的限制&#xff0…

React轻松开发平台:实现高效、多变的应用开发范本

在当今快节奏的软件开发环境中&#xff0c;追求高效、灵活的应用开发方式成为了开发团队的迫切需求。React低代码平台崭露头角&#xff0c;为开发人员提供了一种全新的开发范式&#xff0c;让开发过程更高效、更灵活&#xff0c;从而加速应用程序的开发周期和交付速度。 1. 快…

MacOS开发环境搭建

MacOS开发环境搭建 一、MacOS二、Python三、MacOS搭建Python开发环境1.Python下载地址1.1 Python官网地址1.2 Python下载地址 2.安装Python3.安装Python4.安装PyCharm5.创建一个Python项目6.配置PyCharm7.安装Python包8.运行Python代码9.总结 一、MacOS macOS是一套由苹果开发的…

sql面试题21:营销带货销量分析

题目大概意思&#xff1a; 找出网红带来的订单号和销售额&#xff08;销售额是该订单的&#xff0c;比如凑单&#xff09;&#xff0c;满足是优惠码是1的&#xff0c;B类商品 数据表两个&#xff0c;分别是订单和品类 CREATE TABLE 订单 (订单号 VARCHAR(512),商品号 VARCH…

第五篇:人工智能与机器学习技术VS创意创新(creative)--- 我为什么要翻译介绍美国人工智能科技巨头IAB公司?

【如无特殊说明&#xff0c;本文所有图片均来源于网络】 IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&…

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee

目录 1. 编译器 gcc 1.1 背景知识 1.2 gcc如何完成 2.1 Makefile背景 2.2 Makefile原理 2.3 Makefile常用符号 3. 模拟倒计时 4. 模拟进度条 5. 使用 git 命令行 5.1 安装 git 5.2 创建项目下载到本地 5.3 推送本地代码到远端仓库 1. 编译器 gcc 1.1 背景知识 预处…

Ollama--本地大语言模型LLM运行专家

文章目录 1、问题提出2、解决方案3、Ollama介绍3.1、Ollama的核心功能3.2、Ollama的独特之处 4、Ollama安装与使用4.1、Ollama的安装 5、使用Docker6、模型库和自定义模型7、应用场景展望8、结语 1、问题提出 使用chatgpt之类的闭源大语言模型时&#xff0c;我们与ai沟通的数据…

javaEE基于springboot民宿推荐系统springmvc+mybatis+jsp]

该民宿推荐系统应能够完成民宿推荐信息发布的需求&#xff0c;程序安全&#xff0c;操作应简单易行&#xff0c;通过简洁美观的前端页面引导即可完成操作。从多角度多方面思考理解大众用户的功能需求&#xff0c;思考系统应该具备的核心功能模块&#xff0c;并完成相应开发。民…

如何用生成式人工智能准备和制作吸引人的美食视频?

YouTube是一个全球性的视频分享平台&#xff0c;上面充满了各式各样的内容&#xff0c;其中美食内容因其视觉和味觉上的双重吸引而备受欢迎。作为一个想要进入这个领域的创作者&#xff0c;你需要知道如何准备和制作吸引人的美食视频。以下是一些基本步骤和技巧&#xff1a; 选…

HUAWEI 华为交换机 配置 MAC 防漂移 防MAC伪造示例

组网需求 某企业网络中&#xff0c;用户需要访问企业的服务器。如果某些非法用户从其他接口假冒服务器的MAC 地址发送报文&#xff0c;则服务器的 MAC 地址将在其他接口学习到。这样用户发往服务器的报文就会发往非法用户&#xff0c;不仅会导致用户与服务器不能正常通信&…

ipv6过渡技术-IPv4 over IPv6隧道示例

实验拓扑如下&#xff1a; 环境概述&#xff1a; PC1和PC2与路由器之间为IPv4网络。两台路由器之间为IPv6网络&#xff0c;通过配置&#xff0c;要求是PC1与PC2能互通。即使IPv4可以在IPv6网络中通信。 配置方法&#xff1a; AR1&#xff1a; # ipv6 # interface Gigabi…

【译】WordPress Bricks主题安全漏洞曝光,25,000个安装受影响

WordPress的Bricks主题存在一个严重的安全漏洞&#xff0c;恶意威胁行为者正在积极利用该漏洞在易受攻击的安装上运行任意PHP代码。 该漏洞被跟踪为CVE-2024-25600&#xff08;CVSS评分&#xff1a;9.8&#xff09;&#xff0c;使未经身份验证的攻击者能够实现远程代码执行。它…