upload-labs 21关解析

目录

一、代码审计

二、实践

三、总结


一、代码审计

$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 = "请选择要上传的文件!";
}

对源代码进行分析

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

这是个三元运算符,判断 'save_name' 是否为空 

(A ? B : C  ,如果A成立,则运行B,否则运行C)

如果用户提交的'save_name'为空,则使用上传文件的原始文件名,若不为空则使用该参数值作为文件名

 if (!is_array($file)) {$file = explode('.', strtolower($file));}

判断 $file 是不是数组,如果不是数组,则使用 . 进行切分变为数组

比如 cooper.php.jpg,切分为 cooper php jpg 分别对应数组三个元素

 $ext = end($file);

从数组中获取最后一个元素作为扩展名

经过这两条分析,想想为什么要判断 'save_name' 参数是否为数组呢?

难道POST提交的不都是字符串吗?

那么就进行测试

发现请求参数可以直接以数组的方式提交

那么我们能否去构造一个POST请求的save_name参数,将文件后缀名改为jpg,但文件本身还是cooper.php

问题保留一下,接着分析

$file_name = reset($file) . '.' . $file[count($file) - 1];

reset函数为调用第一个元素

拼接文件名:数组第一个元素 + . + 数组最后一个元素

比如文件名为cooper.php,则 $file_name = cooper + . + php

那么如果直接上传的不是字符串,而是数组会怎么样?

比如save_name[0] = cooper.php , save_name[2] = jpg

按照拼接方法那我们构造的文件最后的方式为:

$file_name = cooper.php . $file[1]   ==> cooper.php.空

理论可行,实践开始!

二、实践

首先上传一个带有木马的php文件,使用burp抓包

.

将其修改为以下格式

提示上传成功,那么就来测试一下

试验成功!

三、总结

复盘一下:先进行代码审计,然后看到分割数组,思考为什么要进行分割,难道POST可以上传数组吗?然后进行实验,实验验证确实可以上传数组形式。接着代码审计,发现文件拼接时具有漏洞,那么构造payload进行尝试,最后成功!

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

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

相关文章

一个程序员的牢狱生涯(38)答案

星期一 答 案 我被这个不知道什么时候无声无息的出现在身后的人吓出了一身的冷汗。 看到我发现了他,这个人慢慢地抬起了头……“他X的,是小X州!” 此时的小X州脸上并没有着急等待上厕所的表情,反而是用一种狡黠的眼神看着我。一直充满的敌意,现在又多了一丝威胁的神情,让…

Quartus Cyclone I II III IVE 器件型号

玩耍了一个 EP2 型号的开发板,发现 安装的quartus13 没有Cyclone II 型号,经过探索发现了是版本不对。 https://www.intel.com/content/www/us/en/software-kit/711920/intel-quartus-ii-subscription-edition-design-software-version-13-0sp1-for-win…

行业分析---造车新势力之蔚来汽车

1 前言 在之前的博客中,笔者分析了苹果《行业分析---我眼中的Apple Inc.》,苹果已经成为世界级的公司。随后也分析了电动汽车公司特斯拉《行业分析---马斯克的Tesla》,特斯拉也在不断成长。目前能分析的新能源汽车公司不多,小米汽…

Minecraft服务器如何搭建

Minecraft这是原版英文名称,在中国大陆被译为《我的世界》,这款游戏很火爆。台湾的很多小伙伴也在玩,其译名为《我的创世神》。现在这款游戏在国内已经被网易代理了。因为这款游戏开源,所以任何人都可以搭建服务器端,如…

机器人支持回调接口配置(详细教程)

大家伙,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 一、前言 今天,给大家介绍一下,如何在机器人中配置回调地址和接口编写。很多时候我们可能有这样的场景,收到消息后,想自己处理一下消息的内…

【Linux】Linux的基本指令_2

文章目录 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待续 二、基本指令 8. man Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问…

基于门控的循环神经网络:GRU

门控循环单元&#xff08;GatedRecurrentUnit&#xff0c;GRU&#xff09;网络&#xff0c;也是一种基于门控的循环神经网络&#xff0c;但是名气不如LSTM大&#xff0c;GRU是对LSTM的一种改版&#xff0c;可以理解为是LSTM的简化版。LSTM有三个门&#xff0c;输入门&#xff0…

【C++】牛客 ——DP36 abb

✨题目链接&#xff1a; DP36 abb ✨题目描述 leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串&#xff0c;她想知道有多少个 "abb" 型的子序列&#xff1f; 定义&#xff1a; abb 型字符串满足以下…

perl:用 Net::Server 创建简单的流媒体服务器

这是一个使用Perl Net::Server 模块创建的简单流媒体服务器示例&#xff0c;它能够播放.flv文件。 首先&#xff0c;确保安装了Net::Server模块&#xff0c;如果没有安装&#xff0c;可以使用CPAN来安装它&#xff1a; 运行 cpan Net::Server RHANDOM/Net-Server-2.014.tar.…

力扣刷题--448. 找到所有数组中消失的数字【简单】

题目描述 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6…

Python零基础-中【详细】

接上篇继续&#xff1a; Python零基础-上【详细】-CSDN博客 目录 十、函数式编程 1、匿名函数lambda表达式 &#xff08;1&#xff09;匿名函数理解 &#xff08;2&#xff09;lambda表达式的基本格式 &#xff08;3&#xff09;lambda表达式的使用场景 &#xff08;4&…

js 实现贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。请注意&#xff0c;贪心算法并不总是能保证得到全局最优解&#xff0c;但在某些问题上&#xff0c;它可以提供足够好的解决方案。下面是一个使用Java…

前端知识1-3:模块化+浏览器详解

script标签两个变量参数 - async & defer <script src"main.js" async></script>普通 - 解析到标签&#xff0c;立刻pending&#xff0c;并且下载执行defer - 解析到标签&#xff0c;开始异步下载&#xff0c;解析完成之后开始执行async - 解析到标签…

内存函数详解,包含部分字符串函数

目录 一&#xff0c;memcpy内存函数的介绍 二memmove函数的介绍 三&#xff0c;memset的函数使用 四&#xff0c;memcmp的介绍 五&#xff0c;内存函数的模拟实现&#xff0c;以及一个字符串函数strstr的模拟实现 5.1memcpy函数的实现 5.2memmove的模拟实现 5.3memcmp的模拟…

Shell环境变量深入:自定义系统环境变量

Shell环境变量深入&#xff1a;自定义系统环境变量 目标 能够自定义系统级环境变量 全局配置文件/etc/profile应用场景 当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序使用 以后只要是所有Shell程序或命令使用的变量…

H.机房【蓝桥杯】/数组链式前向星建图+堆优化版dijkstra

机房 数组链式前向星建图堆优化版dijkstra #include<iostream> #include<queue> #include<cstring> #include<vector> using namespace std; typedef pair<int,int> pii; //无向图开两倍 int e[200005],ne[200005],v[200005],h[200005],du[1000…

STL---unordered set和unordered multiset【无序集合】

1.1 定义及初始化&#x1f357; 下面列出常用的初始化方式 #include <unordered_set> #include <iostream> using namespace std; //输出s中的所有元素 template<typename T> void Show(const T& s) {for (auto& x : s) …

Python的pip配置、程序运行、生成exe文件

一、安装Python 通过官网下载对应的版本&#xff0c;安装即可。 下载地址&#xff1a;Download Python | Python.org Python标准库查看&#xff08;Python自带库&#xff09; Python 标准库文档 安装Python的时候&#xff0c;如果选第二个自定义安装要记得勾选安装pip 二、…

2024/05/25学习记录

1、面经复习&#xff1a;前端广度 2、代码随想录刷题&#xff1a;动态规划 3、rosebush 完成input组件基础

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…