当前位置: 首页 > news >正文

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.lryc.cn/news/355998.html

相关文章:

  • 常用汇编指令
  • LabVIEW软件需求分析文档内容和编写指南
  • spring cache(三)demo
  • Android 应用开发语言选择对比
  • Git 小白入门到进阶—(基本概念和常用命令)
  • 大数据框架总结(全)
  • 44、Flink 的 Interval Join 详解
  • H6246 60V降压3.3V稳压芯片 60V降压5V稳压芯片IC 60V降压12V稳压芯片
  • 【MySQL精通之路】查询优化器的使用(8)
  • Docker in Docker(DinD)原理与实践
  • 科技前沿:IDEA插件Translation v3.6 带来革命性更新,翻译和发音更智能!
  • 【并发小知识】
  • python将多个音频文件与一张图片合成视频
  • JavaEE:Servlet创建和使用及生命周期介绍
  • 【Python设计模式15】适配器模式
  • 【Python设计模式05】装饰模式
  • kafka 消费模式基础架构
  • nginx安装部署问题
  • 揭开Java序列化的神秘面纱(上)Serializable使用详解
  • 深度学习——自己的训练集——图像分类(CNN)
  • goimghdr,一个有趣的 Python 库!
  • 每小时电量的计算sql
  • 自动化您的任务——crewAI 初学者教程
  • K8s集群中的Pod调度约束亲和性与反亲和性
  • kafka之consumer参数auto.offset.reset
  • 回答篇二:测试开发高频面试题目
  • React18 apexcharts数据可视化之甜甜圈图
  • 如何通过OpenHarmony的音频模块实现录音变速功能?
  • 探索 Rust 语言的精髓:深入 Rust 标准库
  • Log360:护航安全,远离暗网风险