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

文件上传漏洞(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.php
        var 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.kler.cn/a/105236.html

相关文章:

  • php-手动搭建windows的php和nginx、phpmyadmin环境
  • uniapp把文件中的内复制到另一个文件中
  • 数据清洗与规范化详解
  • 分布式事务——CAP理论 解决分布式事务的思路 Seata组件初识 和 部署
  • linux实现基础网络库(socket,epoll,pthread,cmake,pipe, sem,codition,)
  • 一台服务器最大能支持多少条 TCP 连接
  • nginx负载均衡配置
  • 逐字稿 | 视频理解论文串讲(下)【论文精读】
  • 【数据结构】ST 表与 RMQ 算法
  • 如何把项目上传到Gitee(详细教程)
  • elasticsearch-5.6.15集群部署,如何部署x-pack并添加安全认证
  • 理解V3中的proxy和reflect
  • 【0229】libpq库实现压测PG服务器max_connections的最大连接数
  • CSS动画 transition和animation
  • MongoDB 学习笔记(基础)
  • Ceres 使用笔记
  • 【QT】信号和槽
  • layui移除(删除)table表格的一行
  • 一键同步,无处不在的书签体验:探索多电脑Chrome书签同步插件
  • linux安装vscode vscode使用 创建项目并运行