• 文件上传漏洞(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>
    
    
    <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>  码:td>
            <td><input type="password" id="password" name="password"/>td>
        tr>
        <tr> 
            <td>  像:td>
            <td><input type="file" name="photo" id="photo">td>
        tr>
        <tr>
            <td colspan="2"><button type="submit">注册button>td>
        tr> 
    form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    绕过前端:

    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");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    判断 Content-Type

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

    绕过后端:

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

  • 相关阅读:
    【广州华锐互动】VR党建多媒体互动展厅:随时随地开展党史教育
    nginx 代理服务时遇到的问题
    认识计算机
    Mac Pycharm和Anaconda配置pytorch环境
    【Java】多线程面试总结
    java基于Springboot+vue的健身房课程预约平台 element
    css学习——sass(6)
    锁的概念!
    【web前端开发】HTML知识点超详细总结
    基于yolov5轻量级的学生上课姿势检测识别分析系统
  • 原文地址:https://blog.csdn.net/bua200720411091/article/details/134041163