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; // 如果不是上述类型的图片,则返回 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、图片马绕过上传

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云和阿里云哪个好?云服务器价格表对比

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器62元一年,2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

C# LINQ运算符

LINQ运算符 1. 概述1.1 集合->集合1.1.1 筛选运算符1.1.2 映射运算符1.1.3 连接运算符1.1.4 排序运算符1.1.5 分组运算符1.1.6 集合运算符1.1.7 转换方法:Import1.1.8 转换方法:Export 1.2 集合->单个元素或标量值1.2.1 元素运算符1.2.2 聚合方法1.2.3 数量词 1.3 空->…

1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数

1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 这是教程中的一个函数,通过汇编来实现的。注释部分以及结合后面的讲解部分,可能还是有一点点细节的地方让初学者疑惑。我结合我自己的理解…

龙格-库塔法

概要 微分方程:含参数、未知函数、未知函数的导数(或者微分)的方程数值求解:用若干离散点计算 近似值 来代替准确值分类:单步法、多步法;隐式法、显示法欧拉法 (欧拉折线法),也是一阶龙格-库塔…

【数据结构】图解二叉搜索树的新增、搜索、删除

一、概念 二叉搜索树(Binary Search Tree,简称BST)也称为二叉查找树或二叉排序树,是一种具有特殊性质的二叉树数据结构。 定义和性质: 二叉搜索树中的每个节点包含一个键值,习惯上我们说左子树上所有节点…

乔琼:高性能会议传声器的产品优化设计| 演讲嘉宾公布

一、智能家居与会议系统 智能家居与会议系统分论坛将于3月28日同期举办! 智能会议系统它通过先进的技术手段,提高了会议效率,降低了沟通成本,提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这里&#x…

部署运维 防火墙,进程 常用命令

防火墙: 1. 查看是否安装了firewalld sudo systemctl status firewalld 查看防火墙状态或者sudo systemctl is-active firewalld 查看防火墙是否是开启状态 2. 开放6379port sudo firewall-cmd --add-port6379/tcp --permanent 刷新防火墙 sudo firewall-cmd --reload 3…

MinIO Client(mc)基本使用

一、Linux安装 1、下载最近的mc 命令,并保存到当前用户的bin目录下,这样可以直接执行,不用修改path curl -sL https://dl.minio.org.cn/client/mc/release/linux-amd64/mc -o /usr/bin/mc chmod x /usr/bin/mc二、配置使用 1、查看mc已经…

【洛谷 P8748】[蓝桥杯 2021 省 B] 时间显示 题解(数学+模运算+输入输出)

[蓝桥杯 2021 省 B] 时间显示 题目描述 小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示…

MATLAB KL变换

1. 原理 KL变换步骤: 1.求样本X的协方差矩阵R 2.求 R的特征值λ。选取前d个较大的特征值。 3.计算d个特征值对应的特征向量,归一化后构成变换矩阵U。 4.对{X}中每一个X进行K-L变换,得到变换后向量YU’ * X,d维向量Y就是…

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统:Alibaba Cloud Linux 3.2104 LTS 64位MySQL:mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置:etc/my.cnf进入远程连接后可以打…

解决vue项目本地开发完成后部署到服务器后报404的问题

一、如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件 常规布署我们只需要将这个目录上传至目标服务器即可 /…

163邮箱SMTP设置需要怎么配置?如何开启?

163邮箱SMTP设置教程?163邮箱开通SMTP发信功能方法? 当我们需要使用第三方工具或软件来发送邮件时,SMTP设置就显得尤为重要。特别是对于使用163邮箱的用户来说,掌握163邮箱SMTP设置的方法是非常必要的。下面,AokSend就…

javaweb学习(day06-servlet)

一、基本介绍 1 官方文档 地址: https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.htmlServlet 和 Tomcat 的关系: 一句话, Tomcat 支持 Servlet【假如单独使用Servlet就失去了意义】 2 为什么会出现 Servlet 提出需求: 请用你现有的html css javascript&#…

JavaSE(上)-Day3

JavaSE(上)-Day3 IDEA(目前业内最好用的开发软件)初始使用IEDA的基础设置 本篇主要介绍内容如下: IDEA的基本使用IDEA的基础设置 IDEA(目前业内最好用的开发软件) IDEA是用于Java语言开发的集…

springboot之mybaitsPlus

mybaitsPlus是国内开发的,并不是springboot的项目,只是学习的时候直接就是适配的springboot。 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不…

微服务获取登录用户Id与单体服务下获取用户Id对比(黑马头条Day03)

前置声明 当前前后端分离开发项目中,后端某个请求向具体某个数据库中的多个表插入数据时,经常需要使用到当前登录用户的Id(唯一标识)。在当前用户线程下以实现变量共享,同时为了避免不同用户线程之间操作变量的影响&am…

设计模式之模版方法实践

模版方法实践案例 实践之前还是先了解一下模版方法的定义 定义 模板方法模式是一种行为设计模式,它定义了一个骨架,并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法,其中包含了主要步骤&#xf…

【Python】成功解决TypeError: ‘float‘ object is not iterable

【Python】成功解决TypeError: ‘float’ object is not iterable 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得…

Mysql按照月份分组统计数据,当月无数据则填充0

目录 起因实现结论 起因 最近有个需求需要在sql中实现获取近半年的统计数据,本来以为挺简单的,不过这个项目数据基本没有,在此情况下还要实现获取近半年的数据就没办法简单group by了 实现 #如果每个月都有数据的话是比较简单的 SELECT DA…