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

文件上传漏洞(1), 文件上传绕过原理

文件上传漏洞

一, 前端校验上传文件

添加 Javascript 代码,然后在 form 表单中 添加 onsubmit="returb checkFile()"

<script>function checkFile() {// var file = document.getElementsByName('photo')[0].value;var file = document.getElementById('photo').value;if (file == null || file == "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext = ".jpg|.png|.gif";//提取上传文件的类型 xxx.yyy.shell.phpvar ext_name = file.substring(file.lastIndexOf("."));//判断上传文件类型是否允许上传if (allow_ext.indexOf(ext_name) == -1) {var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;alert(errMsg);return false;}}
</script><!-- 上传附件,必须要加上 enctype="multipart/form-data" 属性  -->
<form action="reg.php" method="POST" enctype="multipart/form-data" onsubmit="return checkFile()"><tr><td width="40%">用户名:</td><td width="60%"><input type="text" id="username" name="username" /></td></tr> <tr> <td>&nbsp;&nbsp;码:</td><td><input type="password" id="password" name="password"/></td></tr><tr> <td>&nbsp;&nbsp;像:</td><td><input type="file" name="photo" id="photo"></td></tr><tr><td colspan="2"><button type="submit">注册</button></td></tr> 
</form>

绕过前端:

1. 在浏览器设置中禁用js
通常不建议使用这种方式, 因为前端js中可能存在很多其他js的功能, 例如ajax请求.

2. 用burpsuite等工具修改请求.
因为前端js对文件类型做了限制, 那么将需要执行的php文件后缀名修改为jpg, 先绕过js检查, 提交请求后用burp suite捕获.
在burpsuite中修改提交的数据, 将 filename 参数中的文件扩展名改回php再发送.

文件上传成功后, 通过前端工具查找上传的文件路径, 比如头像的url路径, 然后访问执行代码:
http://192.168.112.200/security/upload/20231025_172754.php?cmd=phpinfo();

二, 后端校验上传文件

前端有可能通过burp suite等工具绕过. 后端对提交过来的文件类型进行限制.

判断文件后缀名

// 不允许上传的文件的后缀名是.php
$fileName = $_FILES['photo']['name']; // 获取文件的原始文件名
$extName = end(explode(".", $fileName));
if ($extName == 'php') {die("invalid-file");
}

判断 Content-Type

$fileType = $_FILES["photo"]["type"];
if ($fileType != 'image/jpeg' && $fileType != 'image/png' && $fileType != 'image/gif') {die("invalid-file");
}

绕过后端:

1. 尝试大小写绕过, 例如修改请求信息filename="mm.php" 修改为 mm.PhP
2. 使用burpsuite修改Content-type

http://www.lryc.cn/news/206773.html

相关文章:

  • 【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】
  • 虹科 | 解决方案 | 汽车示波器 学校教学方案
  • 广播和组播(多播)
  • 【Linux】gdb调试
  • MySQL创建函数及其使用
  • 大数据-Storm流式框架(四)---storm容错机制
  • SpringBoot项目把Mysql从5.7升级到8.0
  • RK3568-适配at24c04模块
  • Banana Pi BPI-W3 ArmSoM-W3之RK3588-MIPI-DSI屏幕调试笔记
  • Git的远程仓库
  • Linux虚拟网络设备—Veth Pair
  • Parcelable protocol requires the CREATOR object to be static on class com.test
  • Python的Matplotlib库:数据可视化的利器
  • 普通人做抖店,需要具备什么条件?一篇详解!
  • Django分页功能的使用和自定义分装
  • React-hooks有哪些用法?
  • 2024年CFA一级公示表,一级quicksheet(内附分享链接)
  • 【Kubernetes】 Kubernetes 了解云原生的原理
  • 什么是jquery
  • 竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别
  • 新华三路由器+华为交换机,实现华为交换机指定端口访问外网
  • Java面试(JVM篇)——JVM 面试题合集 深入理解JVM虚拟机
  • NPDP产品经理证书是什么行业的证书?
  • 37 深度学习(一):查看自己显卡的指令|张量|验证集|分类问题|回归问题
  • 用C语言解决三个整数比大小,x,y,z三个整数求最小整数,从键盘上输入3个不同的整数×,y,Z,请设计一个算法找出其中最小的数,并画出流程图。
  • 操作系统进程调度算法的模拟实现(c语言版本)
  • webbench压测工具
  • HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能
  • docker搭建个人镜像仓库
  • Python机器学习17——Xgboost和Lightgbm结合分位数回归(机器学习与传统统计学结合)