一、白名單繞過
相對于前面的黑名單繞過,白名單更加難以繞過,使用白名單驗(yàn)證相對比較安全,但如果存在可控參數(shù)目錄,也存在被繞過的風(fēng)險
目錄可控%00截斷繞過上傳
upload-lab pass11 源碼分析
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
}
else{
$msg = '上傳失?。?;
}
}
else{
$msg = "只允許上傳.jpg|.png|.gif類型文件!";
}
}
deny_arr變成ext_arr,白名單,下面判斷后綴名是否在白名單中,代碼相較于黑名單也簡單不少
但是這里使用了$_GET['save_path']獲取客戶端的值,這個值可以被客戶端修改,從而遺留安全隱患
截斷文件名
%00截斷需要gpc關(guān)閉 php版本要小于5.3.4版本
我這里版本是5.4.45先選擇一個低版本
?關(guān)閉gpc
?文章來源地址http://www.zghlxwxcb.cn/news/detail-814855.html
這種攻擊手法其實(shí)與sql注入中的注釋差不多,%00的意思是忽略后面的內(nèi)容進(jìn)行上傳,如果我們上傳test.png再給服務(wù)器傳遞的save_path改為/upload/test.php%00那么最終上傳到服務(wù)器的內(nèi)容為test.php,操作一下,看起來就直觀了
嘗試上傳
看到這里save_path其實(shí)就是本地的upload文件夾的路徑,在后端中與檢測后的文件名拼接,將文件上傳,我們通過截斷,忽略檢測后的內(nèi)容,直接上傳到我們寫入的文件中
因?yàn)橐阎莋et型,所以直接寫%00就ok,get型需要進(jìn)行編碼
?清空前面上傳的內(nèi)容
放包
上傳成功
POST型截斷
pass-12
只是將GET改成POST了
嘗試上傳
一樣的套路,上傳test.php抓包
直接在抓包里進(jìn)行解碼再放包就ok了
二、文件頭檢測繞過
有的文件上傳,上傳時會檢測文件頭,不同的文件,文件頭也不一樣,常見的文件上傳圖片頭檢測 它檢測圖片兩個字節(jié)長度,如果不是圖片格式,會禁止上傳文件
常見的文件頭
PNG:89504E47
JPEG:FFD8FF
GIF:47494638
....
對隱寫術(shù)有些了解的同學(xué)應(yīng)該對這個很熟悉啦
pass-13
代碼分析
nction 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;
}
這時提取文件頭的函數(shù)
對文件進(jìn)行解包
?
轉(zhuǎn)成整型,然后白名單判斷
下面就是獲取上傳文件,調(diào)用這個函數(shù),返回如果不是unknown就上傳,代碼就不展示了
圖片一句話木馬
為了繞過上述的檢測,我們可以制作圖片馬,即將圖片信息與木馬組合到一起上傳
制作
準(zhǔn)備一張正常的圖片,與惡意腳本php,放到一個目錄下
?
?目錄下運(yùn)行CMD,執(zhí)行
copy 1.png/b+test.php test.png
?
生成了一個新的png,我們直接給它上傳到服務(wù)器
?
右鍵圖片打開鏈接(獲取圖片地址),復(fù)制url
upload/3520221023175627.png
?這里需要利用文件包含漏洞,才能執(zhí)行我們的圖片馬
我看大佬們這一關(guān)直接有個提示,有個鏈接,就是存在文件包含漏洞網(wǎng)頁,但我這個靶場可能抽風(fēng)了,我找了半天也沒找到,所以我就自己寫了一個,如果你們也沒有可以直接再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__);
}
?>
復(fù)制保存就ok了
下面進(jìn)入文件包含漏洞頁面
將圖片地址給傳進(jìn)去
?看到一堆亂碼,這就是前面圖片的內(nèi)容,往下翻,就可以看到phpinfo()的結(jié)果啦
上傳成功!
三、圖片檢測函數(shù)繞過
pass-14
?getimagesize是獲取圖片的大小,如果頭文件不是圖片會報錯,直接可以利用圖片馬
上傳
一樣的上傳我們做好的圖片馬,通過包含漏洞,進(jìn)行執(zhí)行
文章來源:http://www.zghlxwxcb.cn/news/detail-814855.html
?
到了這里,關(guān)于文件上傳漏洞進(jìn)階教程/白名單繞過/圖片馬制作/圖片馬執(zhí)行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!