一、分析源代碼
//index.php
// 初始化變量:標記上傳狀態和錯誤消息
$is_upload = false;
$msg = null;// 檢查是否通過POST方式提交了表單
if (isset($_POST['submit']))
{// 引入自定義上傳類require_once("./myupload.php");// 生成基于時間戳的文件名(避免重復)$imgFileName = time();// 創建上傳類實例,傳入上傳文件的相關信息$u = new MyUpload($_FILES['upload_file']['name'], // 原始文件名$_FILES['upload_file']['tmp_name'], // 臨時文件路徑$_FILES['upload_file']['size'], // 文件大小$imgFileName // 自定義文件名);// 調用上傳方法,傳入目標目錄(由UPLOAD_PATH常量定義)$status_code = $u->upload(UPLOAD_PATH);// 根據返回的狀態碼處理結果switch ($status_code) {case 1:$is_upload = true;$img_path = $u->cls_upload_dir . $u->cls_file_rename_to;break;case 2:$msg = '文件已經被上傳,但沒有重命名。';break; case -1:$msg = '這個文件不能上傳到服務器的臨時文件存儲目錄。';break; case -2:$msg = '上傳失敗,上傳目錄不可寫。';break; case -3:$msg = '上傳失敗,無法上傳該類型文件。';break; case -4:$msg = '上傳失敗,上傳的文件過大。';break; case -5:$msg = '上傳失敗,服務器已經存在相同名稱文件。';break; case -6:$msg = '文件無法上傳,文件不能復制到目標目錄。';break; default:$msg = '未知錯誤!';break;}
}
//myupload.php?
class MyUpload{// 允許上傳的文件擴展名白名單(包含多種類型)var $cls_arr_ext_accepted = array(".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",".html", ".xml", ".tiff", ".jpeg", ".png" );/** upload()**** 上傳文件的主方法,外部只需調用此方法** @param String 上傳目標目錄** @returns void**/function upload( $dir ){// 檢查文件是否成功上傳到臨時目錄$ret = $this->isUploadedFile();if( $ret != 1 ){return $this->resultUpload( $ret );}// 設置并驗證上傳目錄$ret = $this->setDir( $dir );if( $ret != 1 ){return $this->resultUpload( $ret );}// 檢查文件擴展名是否在白名單中$ret = $this->checkExtension();if( $ret != 1 ){return $this->resultUpload( $ret );}// 檢查文件大小是否超過限制$ret = $this->checkSize();if( $ret != 1 ){return $this->resultUpload( $ret ); }// 如果設置了檢查文件存在性的標志if( $this->cls_file_exists == 1 ){// 檢查目標目錄是否已存在同名文件$ret = $this->checkFileExists();if( $ret != 1 ){return $this->resultUpload( $ret ); }}// 所有檢查通過,準備將文件從臨時目錄移動到目標目錄$ret = $this->move();if( $ret != 1 ){return $this->resultUpload( $ret ); }// 檢查是否需要重命名文件if( $this->cls_rename_file == 1 ){$ret = $this->renameFile();if( $ret != 1 ){return $this->resultUpload( $ret ); }}// 所有操作成功完成return $this->resultUpload( "SUCCESS" );}
}
?二、解題思路
這關的代碼看上去很多,實際和上一關的差別不大,增加了文件擴展名的驗證。參考條件競爭的思路,可以構造一個圖片馬重復上傳。
其實直接上傳一個圖片馬也可以,服務器對擴展名進行了檢查,對文件數據沒有檢查,圖片馬會被保存,再利用文件包含漏洞訪問就行了。
三、解題步驟
1.構造圖片馬上傳。
2.利用文件包含漏洞訪問木馬(注意文件路徑),成功。