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

news/2024/12/24 20:26:56/文章来源:https://www.cnblogs.com/xingzhuz/p/18628659

环境配置

  1. 需要的东西

phpstudy-2018
链接: https://pan.baidu.com/s/1D9l13XTQw7o6A8CSJ2ff9Q
提取码:0278

32 位 vc 9 和 11 运行库
链接: https://pan.baidu.com/s/1pBV3W8UWJe0bmDl_cPFDQw
提取码:0278
upload-labs-master 靶场
链接: https://pan.baidu.com/s/1ERYzrlBe94PAi3A-WagLAw
提取码:0278

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

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

QQ_1732271061098

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

QQ_1732271133489

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

QQ_1732271315958

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

QQ_1732271489255

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

QQ_1732271596089

解题思路

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

QQ_1734311735785

  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

QQ_1732274370172

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

QQ_1734312028567

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

QQ_1732274491172

  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] 没有赋值,所以为空,也就是我们思路的那个样子

QQ_1734313180270

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

QQ_1734313230023

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

QQ_1732274875195

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

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

相关文章

防重复点击处理

方法注册: 调用:

P9017 [USACO23JAN] Lights Off G

前言 困了一下午, 仅仅只搞懂了个大概, 我们赶紧把这些题补了, 冷静一点 思路 观察大样例可以发现, 答案好像都不大 容易证明的是先用最多 \(n\) 次关闭所有开关, 然后在 \(2n\) 次打开每个灯, 这样一定不超过 \(3n\) 次就可以成功的打开所有灯 那么我们考虑以这个为突破口, 枚…

物联网数据处理-iris数据集(鸢尾花)

物联网数据处理-iris数据集(鸢尾花) 大作业题目读入 iris.txt 里的鸢尾花数据,不考虑标签信息(标签是用来监督学习用的,这里是无监督),利用 PCA(减少噪声,利于可视化) 将数据从 4 维降成 2 维 之后,进行以下操作:利用不同的方式构建邻接矩阵(高斯核,k-临近等)(…

基于扩频解扩+turbo译码的64QAM图传通信系统matlab误码率仿真,扩频参数可设置

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要该通信系统主要用于图像传输,适用于对图像质量和传输可靠性要求较高的场景,如无人机图像传输、视频监控、无线电视广播等。在复杂的电磁环境…

SIP协议中与Dialog相关的概念

如下RFC文档所述:在SIP协议中,对话(Dialog)是由两个用户代理(User Agent,简称UA)之间持续一段时间的端到端关系,通过Call-ID、To-tag和From-tag来标识(即Dialog ID),用于对一个会话(Session)进行信令交互。对话代表一个上下文场景,据此来阐释相关的SIP消息(即一系…

HBuilderX运行到微信开发者工具

HBuilderX运行到微信开发者工具

快手MARM 文章理解

阅读了快手的论文 MARM,论文中的算法 符号看起来不容易理解。 对照图自己研究了下, 理解了。需要知道为什么(b) 和(c) 中 的中间结果是相同的。需要知道 masked-self-attention缓存是怎么处理,看箭头快手 MARM: Unlocking the Future of Recommendation Systems through Mem…

NSSCTF--Crypto--[CISCN 2023 初赛]badkey

NSSCTF Crypto [CISCN 2023 初赛]badkey[CISCN 2023 初赛]badkey task: from Crypto.Util.number import * from Crypto.PublicKey import RSA from hashlib import sha256 import random, os, signal, stringdef proof_of_work():random.seed(os.urandom(8))proof = .join([ra…

deque容器/构造函数/赋值操作/大小操作/插入和删除/数据存取/排序

deque容器基本概念 功能: 双端数组,可以对头端进行插入删除操作 deque与vector区别: vector对于头部的插入删除效率低,数据量越大,效率越低 deque相对而言,对头部的插入删除速度会比vector块 vector访问元素时的速度会比deque快,这和两者内部实现有关deque内部工作原理:…

CSS基础-长度单位

💖简介 在CSS中,长度单位分为绝对长度单位和相对长度单位。这些单位用于定义元素的尺寸、边距、填充、字体大小等属性值 vmin和vmax是CSS中的相对长度单位,它们基于视口(viewport)尺寸来定义元素的宽度或高度。这些单位使得元素的尺寸可以根据视口的大小进行缩放,从而有…

基于GRNN广义回归网络和MFCC的语音情绪识别matlab仿真,对比SVM和KNN

1.算法运行效果图预览 (完整程序运行后无水印) filePath =Test_data\悲伤1.wav类型:悲伤 识别置信度Vmax =0.9559 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)Labsn = []; % 遍历每种情绪 for i = 1:length(Em_kind)Labs0…