upload-labs_pass14_pass15_pass16_图片马的制作_结合文件包含漏洞_getimagesize_exif_imagetype
pass14-環境說明
phpstudy中php版本為7.3.4nts
補充一點:upload-labs這個靶場要想全部通過,必須要
調整環境(phpstudy的環境不行,就自行搭建一個apache和php的環境),而且在我已經做好的前13關靶場中,php的版本切換非常正常。所以如果你沒有做出來,也很正常,關鍵是要理解各種繞過的姿勢。
pass14-提示和源碼
檢查圖標內容開頭2個字節
這里牽扯到一個知識點。先買個小關子。
這一關跟前幾關都很不一樣:
要求上傳的是圖片馬。
源碼:
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 = "上傳出錯!";}} }其實在switch中已經寫的很清楚了:
255216–》JPG
13780—〉PNG
7173–》GIF
其余都是unknown
為什么讀取前兩個字節就知道這屬于什么文件呢?這就是“文件頭”的概念
pass14-文件頭
不同的文件類型(txt,exe,jpg等),編碼方式不同,其解析方式也會不一樣(打開方式的程序也會不一樣)。
比如練習過CTF- MISC的人一定都知道:二進制文件用winhex打開很友好,但是用記事本或者Notepas++打開就是一堆亂碼。
對應的解析工具在打開任意一個文件之前,必須首先確定這個文件能不能解析,規不規范。(只修改文件的擴展名也沒有用哦)
所以根據什么來判斷這個文件真正的打開方式,判斷文件的類型呢?只看文件擴展名是不是就不靠譜了,只能看文件頭。
所以一定的文件一定在產生的時候對應自己的規范,文件頭就必須這么寫。(這里不考慮一些隱寫或者惡意修改等異常情況)
這個規范到底是什么呢?
(文件頭長度不同文件類型是不一樣的)
比如:
JPEG (jpg),文件頭:FFD8FF
PNG (png),文件頭:89504E47
GIF (gif),文件頭:47494638
TIFF (tif),文件頭:49492A00
Windows Bitmap (bmp),文件頭:424D
CAD (dwg),文件頭:41433130
Adobe Photoshop (psd),文件頭:38425053
Rich Text Format (rtf),文件頭:7B5C727466
XML (xml),文件頭:3C3F786D6C
HTML (html),文件頭:68746D6C3E
上面的要不要記?那肯定是不用的,人生這么苦短,記這些有什么意義,簡單看一看就行,實際要用再查就行(實際你用多了早就記住不少了)
我在這里列舉一些最為常見的文件頭(網安可能經常會用到的):
常見文件頭列舉
1.png圖片文件包括8字節:
89 50 4E 47 0D 0A 1A 0A 即為.PNG
2.jpg圖片文件包括2字節:
FF D8
3.gif圖片文件包括6字節:
47 49 46 38 39|37 61 即為GIF89(7)a
4.bmp圖片文件包括2字節:
42 4D 即為BM
5…class文件的文件頭:ca fe ba be
簡單來說這種還是很靠譜的,如果攻擊者在上傳的時候,故意將php擴展名改為了jpg,但是如果其校驗的時候看的是文件內容的前兩個字節,那還是無法繞過的。
如何產生有一句話木馬的圖片呢?
制作圖片馬
Windows中命令:(cmder)
copy huaji.jpg /b + shell.php /a shell.gif看到shell.gif生成了
現在如果用記事本或者notepad++打開發現文件頭就是GIF89a。
補充如果是linux那么命令就是
cat huaji.jpg shell.php > shell.jpgpass14-上傳圖片馬
現在準備上傳:
上傳是成功了,但是連接webshell失敗了。
因為代碼在圖片中,沒有辦法執行。
現在該怎么辦呢?
可以看看提示:
要利用文件包含漏洞。
在文件上傳靶場里面有這么一個文件,可以直接訪問:
upload-labs/include.php
<?php /* 本頁面存在文件包含漏洞,用于測試圖片馬是否能正常運行! */ header("Content-Type:text/html;charset=utf-8"); $file = $_GET['file']; if(isset($file)){include $file; }else{show_source(__file__); } ?>連接的webshell改成:
連接webshell成功
pass15
依然是圖片馬。
看源碼:
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()
提示:
通過getimagesize()來判斷上傳的文件是否是圖片文件。
關于這個函數的介紹,可以看看官網的介紹:
https://www.php.net/getimagesize
getimagesize() 函數將測定任何
GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP
圖像文件的大小并返回圖像的尺寸以及文件類型和一個可以用于普通 HTML 文件中 IMG 標記中的 height/width 文本字符串。
如果不能訪問 filename 指定的圖像或者其不是有效的圖像,getimagesize() 將返回 false 并產生一條 E_WARNING 級的錯誤。
貌似沒有其他的攔截。
最關鍵的就是如果上傳的不是一張圖片那么久返回false,報異常。
還是利用14關的圖片馬,上傳:(上傳之前把之前上傳的清空)
然后還是利用文件包含漏洞,連接webshell(URL結構和剛才一致)
再次上傳成功。
所以這一關就是很簡單(有了14關的鋪墊),就是學習了一個函數getimagesize
pass16
也是圖片馬。
看源碼:
這一關利用到了一個新的函數exif_imagetype()
提示:
關于這個函數的介紹:
exif_imagetype() 讀取一個圖像的第一個字節并檢查其簽名。
本函數可用來避免調用其它 exif 函數用到了不支持的文件類型上或和 $_SERVER[‘HTTP_ACCEPT’] 結合使用來檢查瀏覽器是否可以顯示某個指定的圖像。
這個其實和第14關的文件頭檢查是差不多的。
但是這一關要注意:需要開啟php_exif模塊
所以需要更改PHP的版本:
更改成線程安全的7.4.22
(我這里就是用的7.4的版本,是線程安全的,具體的小版本實在是沒有記錄)
同時還要啟用擴展:
上傳木馬之前先清空一下之前上傳的。
然后開始上傳:
好吧上傳沒有成功。。。
但是某一次我的同學用這個版本成功了,所以大家也可以多試試,當然也可以試試其他版本。
最后只能說一點吧,掌握繞過的姿勢很重要,至于有沒有成功,不用太糾結,本身環境對于這種繞過影響是很大的,所以我pass16沒有成功我也沒有氣餒。
再接再厲吧
歡迎關注本人懶的更新的公眾號“小東方不敗”!歡迎大家跟我交流。
總結
以上是生活随笔為你收集整理的upload-labs_pass14_pass15_pass16_图片马的制作_结合文件包含漏洞_getimagesize_exif_imagetype的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: upload-labs_pass12_文
- 下一篇: upload_labs_pass17_二