環境
- phpstudy
- upload-labs,Pass-18
條件競爭文件上傳的原理
直接看代碼進行代碼審計,相關的函數我已經做了注釋
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$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'];
// 查找"."在文件名中出現的最后一個位置,然后位置+1,返回后面的內容
// 其實就是截取文件的后綴名
$file_ext = substr($file_name,strrpos($file_name,".")+1);
// 文件上傳的位置
$upload_file = UPLOAD_PATH . '/' . $file_name;
// 判斷temp文件是否是合法的文件(通過PHP函數 POST方法上傳的文件),如果是的話,將其移動到upload_file處
// 其實這步沒啥用,類似於開頭的if函數,如果點擊submit就運行代碼這樣子
if(move_uploaded_file($temp_file, $upload_file)){
// 如果后綴名在ext_arr里面的話,那么上傳,並且重命名文件
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 = '上傳出錯!';
}
}
?>
分析代碼可得到文件上傳的邏輯,但是此處是存在邏輯漏洞的,在我們進行文件上傳時,服務器先進行文件上傳操作,后判斷我們上傳的文件合不合法,這樣我們上傳的后門文件只要連接的快,那么服務器就來不及刪除它。其原理就是,在我們進行文件讀寫操作時,是不能刪除該文件的。
upload-labs less-18 演示
上傳我們的php文件后門,抓取數據包
將得到的數據包發送到intruder模塊中,選取UA頭進行爆破(修改UA頭部對數據包無影響),其實就是不斷上傳數據包,然后在服務器刪除之前連上這個php后門,那么服務器就刪除不了我們上傳的后門了
設置爆破類型,Start Attack
成功上傳文件