第十五關?getimagesize函數驗證
?一、分析源代碼
function isImage($filename){$types = '.jpeg|.png|.gif';if(file_exists($filename)){$info = getimagesize($filename);$ext = image_type_to_extension($info[2]);if(stripos($types,$ext)>=0){return $ext;}else{return false;}}else{return false;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上傳失敗!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上傳出錯!";}}
}
這里主要看兩個函數,getimagesize()函數和image_type_to_extension()函數。getimagesize()函數的作用是讀取文件的圖像詳細信息,包括尺寸和文件類型等。在文件上傳驗證中,如果文件不是有效圖像,則返回錯誤,是有效圖像則返回一個數組,這里返回的$info[2]是圖像類型代碼。image_type_to_extension()函數的作用是讀取文件類型代碼,轉換為對應的文件擴展名。
二、解題思路
這里雖然使用了getimagesize()函數來驗證文件是否為有效圖像,但是攻擊者仍然可以將一段惡意的php代碼插入正常的圖片中,從而繞過上傳驗證。
雖然這一關和上一關代碼不同,但是做法基本相同。
三、解題步驟
1.準備一張正常的圖片和一段木馬,將其融合成圖片馬。
2.成功上傳后,找到文件路徑,利用文件包含漏洞查看木馬是否被成功執行。
第十六關?exif_imagetype函數驗證
解題思路
目錄
第十五關?getimagesize函數驗證
?一、分析源代碼
二、解題思路
三、解題步驟
第十六關?exif_imagetype函數驗證
解題思路
這一關利用的是exif_imagetype()函數,它和getimagesize()函數的區別是:exif_imagetype()函數的功能更單一,僅僅是檢測圖像類型,但是速度更快。getimagesize()函數可以檢測圖像的寬度、高度、類型等多種信息。兩個函數都需要開啟相應的 PHP 擴展:getimagesize() 需要 GD 擴展,exif_imagetype() 需要 EXIF 擴展
和上一關解法相同。
寫在后面的話:
斷更了一個多月,這段時間的狀態不是很好,現在才調整過來。以后會繼續寫。
寫這個靶場筆記的初衷,是為了Y同學,希望能和她一起交流學習。但她還沒看到,故事就結局了。
那天在操場跑步的時候,一株蒲公英從天空溫柔地飄落。
我和Y同學是春天認識的,Y同學陽光活潑、開朗大方、古靈精怪。我非常悶,和她卻很聊得來。
遇見她之前的那段時間,我的生活狀態不斷向上向好,整個人煥發出蓬勃的生機。
人們說,客觀上當你不需要愛情的時候,主觀上你就做好了迎接她的準備。我竟然開始相信緣分。
我鼓足勇氣,伸出手,向那株蒲公英。
可是沒想到,風一吹,就散了。
故事很美好,只是我單方面認為,結局很遺憾。
然后操場下起了瓢潑大雨,我瘋狂地跑。
我想對Y同學說一句話,也是她當初對我說的,“你什么樣都很好。”
最后雨停了,天空劃出一道絢麗的彩虹。