文件上传漏洞靶场-20

发布于 2021-11-07  156 次阅读


进入靶场环境,查看源码:

对代码进行分析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION); /*pathinfo()的含义是以数组的形式返回关于文件路径的信息*/

        if(!in_array($file_ext,$deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) { 
                $is_upload = true;
            }else{
                $msg = '上传出错!';
            }
        }else{
            $msg = '禁止保存为该类型文件!';
        }

    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

对代码分析后我们发现,上传点是存在二次渲染的并且代码存在逻辑漏洞,代码先进行上传后才判断上传文件的格式,并且变量save_name是可控的,所以我们可以在上传文件时修改数据包的内容,使其绕过黑名单过滤。

具体操作如图:

先上传一个带有php木马的图片

上传过程中抓包:

找到可控变量save_name位置,将文件格式修改为 1.php/.

上传成功,我们访问上传的php文件,并尝试利用一句话木马

调用成功。

造成本关的文件上传漏洞的主要原因是判断上传文件格式时,代码有逻辑漏洞,应先检测上传文件的格式,在进行二次渲染。

为了更透彻的分析本关,我们修改源代码,使$save_name传参赋值给$file_name后,对$file_name进行输出

重新上传一个jpg图片,查看输出的内容:

可以看见,在没有代码没有执行对文件类型的判断时服务器就已经被上传我们所上传的文件。


我从未觉得繁琐,说浪漫些,我很爱你。