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