upload-labs-master第21关超详细教程

news2024/12/24 21:47:32

目录

  • 环境配置
  • 解题思路
    • 利用漏洞
  • 操作演示

环境配置

  1. 需要的东西

phpstudy-2018
链接: phpstudy-2018
提取码:0278

32 位 vc 9 和 11 运行库
链接: 运行库
提取码:0278
upload-labs-master 靶场
链接: upload-lasb-master靶场
提取码:0278

Burpsuit 安装
官网: Professional / Community 2024.9.5 | Releases

  1. 上述安装解压后,打开 phpstudy,点击启动

在这里插入图片描述

  1. 然后在本地浏览器输入 127.0.0.1 打开,显示如下界面表示成功

在这里插入图片描述

  1. upload-labs-master 解压后的整个文件目录复制到 .../PHPTutorial/WWW...,比如我的 C:\phpStudy2018\PHPTutorial\WWW,建议是将整个文件目录复制过来,修改目录名称为 upload(复制整个目录是因为防止文件零散,以后不便于管理)

在这里插入图片描述

  1. upload-labs-master (重命名的 upload) 根目录下创建 upload 文件夹,用来存储我们上传的文件,如果存在就不需要创建了

在这里插入图片描述

  1. 在浏览器输入 127.0.0.1/upload 或者未重命名的 127.0.0.1/upload-labs-master ,或者如果不是复制整个目录,而是目录中的文件到上述目录中,直接 127.0.0.1 即可

在这里插入图片描述

解题思路

  1. 查看这一关的源码,去上述的 upload 或者未重命名之前的 upload-labs-master 目录中,找到 21 关,然后以记事本打开 index.php

在这里插入图片描述

  1. 查看源码
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}

解析:

检查的机制

// 这是表示 content-type 类型必须为这几个
$allow_type = array('image/jpeg','image/png','image/gif');

// 这是表示保存的文件名如果为空,就使用上传的文件的那个文件名,如果指定了保存的文件名,则使用指定的
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

// file 如果不是数组,就将其变为数组,以 '.' 为分割,如 file=shell.php,那么就变为 file[0]=shell, file[1]=php
if (!is_array($file)) {
	$file = explode('.', strtolower($file));
}

// 按数组来取,取数组最后一个,如上述的就是php,而它的检查机制是需要是jpg,png,gif
$ext = end($file);
$allow_suffix = array('jpg','png','gif');

漏洞的存在

$file_name = reset($file) . '.' . $file[count($file) - 1];
  • 这个就是上述检查都通过后,实际最终的文件名形成,取数组第一个和最后一个拼接
  • file[0]=shell, file[1]=php,最终形成就是 shell.php
  • 这也是存在的漏洞,会发现它取的数组最后一个元素,我们考虑利用数组机制来绕过,如何利用呢

利用漏洞

  1. 由于刚开始不是数组,不是数组就会被上述直接变为数组,我们就直接手动让它变为数组,如何修改呢,是通过抓包修改参数解决
  2. 如赋值 file[0]=shell.php,这个是实际的木马源文件,也是我们想上传的,但是由于不是图片类型,content-type 不是满足的类型,通过抓包修改解决。
  3. 赋值 file[1]=null,… 以此类推,由于上述会取数组最后一个元素检查拓展名是否在白名单中,因此最后一个如 file[5]=jpg,这个赋值就只需要满足是 jpg,png,gif 中一个即可,使其检查通过
  4. 这样赋值后的数组,就能完美绕过上述的检查,由于 file[1]~file[4]=null,所以 count 函数计算出来的为 2,那么上述的拼接完整文件名部分就会导致取出 file[0]=shell.phpfile[2-1]=file[1]=null,然后会添加一个 . ,最终 shell.php. ,但实际最后一个 . 后没有内容,服务器会直接忽略,也就变成了 shell.php 作为服务器端保存的文件名,也就达到了绕过的要求

操作演示

  1. 准备一个一行木马文件,保存为 shell.php
<?php phpinfo(); ?>
  1. 打开 Burpsuit 软件,点击 open browser

在这里插入图片描述

  1. 在地址栏中输入 127.0.0.1/upload 进入靶场,然后点击 pass-21 ,选择上传的文件,准备上传(此时不点击上传), 填写保存名称,随意填写,因为后续会通过抓包修改的

在这里插入图片描述

  1. Burpsuite 中,点击 intercept is off 变为 intercept is on

在这里插入图片描述

  1. 回到靶场,点击上传,然后回到 Burpsuite ,会发现捕捉到了信息,然后找到下面的 content-type 修改为满足要求的,如 image/jpeg,image/png,image/gif
  2. 手动将 file 变为数组,修改 name=save_name[0] ,变为数组,然后将值修改为 shell.php ,然后复制一份,目的填写数组最后一个元素 save_name[3],修改为 png, 目的是跳过扩展名的检查,由于 save_name[1], save_name[2] 没有赋值,所以为空,也就是我们思路的那个样子

在这里插入图片描述

  1. 像上述修改后,此时点击左上角的 forward,让行这个抓包的请求,会发现文件上传成功了,也就是我们绕过了这个检查

在这里插入图片描述

  1. 在浏览器中访问上传文件的路径(不是在那个 Burpsuite 中的那个 open browser 打开的地址栏,在本地浏览器中),例如 http://127.0.0.1/upload/upload/shell.php ,如果成功执行了 PHP 代码,说明攻击成功。因为我重命名 upload-labs-masterupload,在这个子目录下的 upload 才是上传文件的保存路径,所以写了两个 upload

在这里插入图片描述

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

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

相关文章

Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)

1、概述 在传统的单体应用中&#xff0c;事务管理相对简单&#xff0c;通常使用数据库的本地事务&#xff08;如MySQL的BEGIN和COMMIT&#xff09;来保证数据的一致性。然而&#xff0c;在微服务架构中&#xff0c;由于每个服务都有自己的数据库&#xff0c;跨服务的事务管理变…

概率论得学习和整理32: 用EXCEL描述正态分布,用δ求累计概率,以及已知概率求X的区间

目录 1 正态分布相关 2 正态分布的函数和曲线 2.1 正态分布的函数值&#xff0c;用norm.dist() 函数求 2.2 正态分布的pdf 和 cdf 2.3 正态分布的图形随着u 和 δ^2的变化 3 正态分布最重要的3δ原则 3.0 注意&#xff0c;这里说的概率一定是累计概率CDF&#xff0c;而…

Day1 苍穹外卖前端 Vue基础、Vue基本使用方式、Vue-router、Vuex、TypeScript

目录 1.VUE 基础回顾 1.1 基于脚手架创建前端工程 1.1.1 环境要求 1.1.2 脚手架创建项目 1.1.3 工程结构 1.1.4 启动前端服务 1.2 vue基本使用方式 1.2.1 vue 组件 1.2.2 文本插值 1.2.3 属性绑定 1.2.4 事件绑定 1.2.5 双向绑定 1.2.6 条件渲染 1.2.7 跨域问题 1.2.8 axios 1.…

esp8266_TFTST7735语音识别UI界面虚拟小助手

文章目录 一 实现思路1 项目简介1.1 项目效果1.2 实现方式 2 项目构成2.1 软硬件环境2.2 完整流程总结&#xff08;重点整合&#xff09;(1) 功能逻辑图(2) 接线(3) 使用esp8266控制TFT屏(4)TFT_espI库配置方法(5) TFT_esp库常用代码详解(6)TFT屏显示图片(7) TFT屏显示汉字(8) …

java web springboot

0. 引言 SpringBoot对Spring的改善和优化&#xff0c;它基于约定优于配置的思想&#xff0c;提供了大量的默认配置和实现 使用SpringBoot之后&#xff0c;程序员只需按照它规定的方式去进行程序代码的开发即可&#xff0c;而无需再去编写一堆复杂的配置 SpringBoot的主要功能…

Windows下ESP32-IDF开发环境搭建

Windows下ESP32-IDF开发环境搭建 文章目录 Windows下ESP32-IDF开发环境搭建一、软件安装二、搭建IDF开发环境2.1 安装VS Code插件&#xff1a;2.2 配置ESP-IDF插件&#xff1a;2.3 下载例程源码&#xff1a; 三、编译和烧录代码四、Windows下使用命令行编译和烧录程序4.1 配置环…

6UCPCI板卡设计方案:8-基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台

基于双TMS320C6678 XC7K420T的6U CPCI Express高速数据处理平台 1、板卡概述 板卡由我公司自主研发&#xff0c;基于6UCPCI架构&#xff0c;处理板包含双片TI DSP TMS320C6678芯片&#xff1b;一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片&#xff1b;六个千兆网口&#xff…

c++--------------------------------接口实现

引用参数 引用的基本概念 在C中&#xff0c;引用是一个别名&#xff0c;它为已存在的变量提供了另一个名字。引用的声明格式为类型& 引用名 变量名;。例如&#xff0c;int num 10; int& ref num;&#xff0c;这里ref就是num的引用&#xff0c;对ref的操作等价于对nu…

docker run命令大全

docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…

rk3568制冷项目驱动开发流程汇总(只适用于部分模块CIF DVP等,自用)

采用fpga输入&#xff0c;3568采集并显示至hdmi RKVICAP 驱动框架说明 RKVICAP驱动主要是基于 v4l2 / media 框架实现硬件的配置、中断处理、控制 buffer 轮转&#xff0c;以及控制 subdevice(如 mipi dphy 及 sensor) 的上下电等功能。 对于RK356X 芯片而言&#xff0c; VICAP…

怎么在idea中创建springboot项目

最近想系统学习下springboot&#xff0c;尝试一下全栈路线 从零开始&#xff0c;下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea&#xff0c;选择file->New->Project 2.选择Spring Initializr->设置JDK->…

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大&#xff0c;容错率低&am…

蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程 第一步 创建新项目 第二步 选择型号和管脚封装 第三步 RCC使能 外部时钟&#xff0c;高速外部时钟 第四步晶振时钟配置 由数据手册7.1可知外部晶振频率为24MHz 最后一项设置为80 按下回车他会自动配置时钟 第五步&#xff0c;如果不勾选可能程序只会…

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…

devops和ICCID简介

Devops DevOps&#xff08;Development 和 Operations 的组合&#xff09;是一种软件开发和 IT 运维的哲学&#xff0c;旨在促进开发、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。它强调自动化流程&#xff0c;持续集成&#xff08;CI&#xf…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

数据结构:算法篇:快速排序;直接插入排序

目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解&#xff1a; ①从待排序元素中选定一个基准元素&#xff1b; ②以基准元素将数据分为两部分&#xff1a;&#xff08;可以将&#xff1a;大于基准元素放左&#xff0c;小于基准元素放右&#xff09; ③对左半部分…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

如何打造用户友好的维护页面:6个创意提升WordPress网站体验

在网站运营中&#xff0c;无论是个人博主还是大型企业网站的管理员&#xff0c;难免会遇到需要维护的情况。无论是服务器迁移、插件更新&#xff0c;还是突发的技术故障&#xff0c;都可能导致网站短暂无法访问。这时&#xff0c;设计维护页面能很好的缓解用户的不满&#xff0…

postman读取文件执行

要从文件获取的变量 text 在pre-request 中写从文件获取数据的脚本。脚本实现了&#xff0c;设置了text默认值&#xff0c;从文件读取text列&#xff0c;将text存入环境变量 //获取text参数 var text "济南天气"; if(data.text){ text data.text } pm.environment.…