目錄
一、文件上傳前端攔截原理
二、第17關 文件上傳(前端攔截)
1.打開靶場
2.構造php腳本
3.源碼分析
(1)js源碼
(2)服務器源碼
(3)總結
4.滲透實戰
(1)禁用js法
(2)修改頁面法
(3)bp改包法
本文通過《webug4.0靶場第17文件上傳之前端攔截》來進行滲透實戰。文件上傳前端攔截是文件上傳前端攔截是一種在前端頁面實現的對文件上傳操作進行限制和驗證的技術手段,但是這種方法可以通過修改前端代碼或直接發送 HTTP 請求來繞過前端的限制,本文通過3種不同的方法實現滲透測試。
一、文件上傳前端攔截原理
文件上傳前端攔截是指在用戶提交文件時,通過瀏覽器端的JavaScript或HTML5技術對文件進行初步驗證,以減少非法文件上傳的風險。前端攔截主要用于提升用戶體驗,快速反饋文件合法性,但不能替代后端安全校驗,因為攻擊者可以繞過前端直接發送惡意請求。
類別 | 詳情 |
---|---|
定義 | 文件上傳前端攔截是指在網頁前端對用戶的文件上傳操作進行限制和驗證的技術,通過一定手段判斷文件是否符合規定,在文件上傳至服務器前進行初步處理 |
目的 | 1.?安全層面:阻止用戶上傳惡意文件(如可執行文件、病毒腳本等)和不符合要求的文件類型,降低服務器被攻擊、感染的風險,防止因文件上傳引發的安全問題; 2.?體驗層面:提前告知用戶文件存在的問題(如格式不支持、大小超限等),減少用戶等待時間和無效網絡請求,提升上傳操作的流暢性和用戶滿意度 |
實現方式 | 以JavaScript 驗證為例:監聽change 事件,獲取用戶所選文件,檢查文件類型(通過file.type )、大小(通過file.size )等屬性。借助FileReader 對象讀取文件部分內容,進一步驗證文件格式,如檢查文件頭; |
優勢 | 1.?即時反饋:能快速在用戶選擇文件后給出反饋,讓用戶及時知曉文件是否符合要求; 2.?減輕服務器壓力:在前端過濾掉大量不符合要求的文件,減少服務器端的驗證工作和無效文件傳輸,節省服務器資源 |
局限性 | 1.?易被繞過:攻擊者可通過修改前端代碼(如修改 JavaScript 驗證邏輯、accept 屬性值)或直接構造 HTTP 請求繞過前端攔截,無法提供絕對的安全防護;2.?驗證范圍有限:前端驗證主要基于文件基本屬性,對于一些復雜的文件內容檢測(如深度病毒掃描、文件內容合規性檢查)能力不足,需結合服務器端驗證 |
二、第17關 文件上傳(前端攔截)
1.打開靶場
打開webug4.0靶場的第17關文件上傳(前端攔截)關卡,完整URL地址如下所示。
http://192.168.71.1/webug4/control/upload_file/upload_file_1.php
2.構造php腳本
構造info.php,腳本內容為獲取服務器的php版本信息,具體如下所示。
<?php phpinfo();?>
隨手上傳php腳本,提示不允許上傳該格式類型,這說明本關卡進行了格式檢查,如下所示。
3.源碼分析
(1)js源碼
右鍵查看源碼,發現是使用js進行滲透的,也就是說這是前端驗證的文件上傳。
(2)服務器源碼
如下服務器源碼并未過濾,看來只有客戶端進行過濾。
<?php
// 引入公共配置文件,該文件通常包含一些全局的函數、常量或配置信息
// 路徑為相對于當前文件的上兩級目錄下的 common 文件夾中的 common.php 文件
require_once "../../common/common.php";// 檢查用戶會話中是否存在 'user' 變量
// 如果不存在,說明用戶未登錄,將用戶重定向到登錄頁面
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}// 檢查上傳文件是否存在錯誤
// $_FILES['file']['error'] 是 PHP 中用于獲取上傳文件錯誤信息的變量
// 如果存在錯誤,直接終止腳本執行
if ($_FILES['file']['error']) {die();
}// 檢查是否有文件被上傳
if ($_FILES['file']) {// 將上傳文件的相關信息賦值給變量 $arr$arr = $_FILES['file'];// 檢查目標上傳目錄中是否已經存在同名文件// TPMELATE 應該是一個定義好的常量,表示上傳目錄的路徑// 如果文件已存在,彈出提示框告知用戶if (file_exists(TPMELATE."/upload/".$arr['name'])){echo "<script>alert('該文件已經存在')</script>";} else {// 將文件名從 UTF-8 編碼轉換為 gb2312 編碼// 這可能是為了適應服務器文件系統的編碼要求$filename = iconv("UTF-8","gb2312",TPMELATE."/upload/".$arr['name']);// 將臨時上傳的文件移動到目標目錄// move_uploaded_file 是 PHP 中用于移動上傳文件的函數// $arr["tmp_name"] 是臨時上傳文件的路徑move_uploaded_file($arr["tmp_name"],$filename);// 輸出文件的完整路徑并終止腳本執行echo $filename;die();}
}// 引入上傳文件頁面的 HTML 文件
// 該文件通常包含一個文件上傳表單
require_once TPMELATE."/upload_file_1.html";
(3)總結
綜上,本關卡存在文件上傳前端繞過的可能性,這是因為前端可被繞過且服務器未做過濾。
前端驗證可被繞過:前端代碼實現的文件類型過濾邏輯僅在客戶端執行。攻擊者可以通過直接修改前端代碼(例如在瀏覽器的開發者工具中修改 JavaScript 代碼)來禁用或繞過這個驗證邏輯。攻擊者不需要經過服務器的驗證,直接構造一個包含惡意文件的 HTTP 請求發送到服務器,就可以實現文件上傳,因為服務器端沒有對文件類型進行二次驗證,所以存在被繞過的風險。
未與服務器端配合:該前端代碼僅在客戶端對文件類型進行判斷,沒有與服務器端的驗證機制緊密配合。服務器端端沒有對上傳文件類型進行嚴格檢查,那么即使前端做了限制,攻擊者依然可以通過其他手段(如直接發送請求)繞過前端的限制上傳任意文件,從而導致安全問題。
4.滲透實戰
(1)禁用js法
將js開關變灰禁用,如下圖紅框所示。
禁用后刷新頁面,再次上傳文件,這里要特別強調如果不刷新會上傳失敗,此時上傳成功,具體如下所示顯示了腳本的完整URL地址。
上一步獲取到的腳本路徑如下所示。
D:/web/phpstudy_pro/WWW/webug4/template/upload/info.php
根據文件上傳路徑構造木馬路徑,如下所示。
http://192.168.71.1/webug4/template/upload/info.php
做完滲透后記得打開js開關,如下所示。
打開開關后記得刷新頁面才可以生效。
(2)修改頁面法
右鍵查詢元素-搜索框輸入關鍵字filter。
?找到onchange,使其等于空處理,刪除js的處理函數οnchange="type_filter(this.files)"。
將如下函數變為空處理。
onchange="type_filter(this.files)"
變空后如下所示。
onchange=""
修改后如下所示。
重新復制info.php,將文件復制為info1.php,修改后不刷新頁面上傳php文件。
上傳結果如下所示。
如下所示,上傳的腳本執行成功。
(3)bp改包法
由于對文件的檢查是客戶端處理,故而可以在客戶端上傳圖片,繞過客戶端的前端檢查然后在bp中修改報文并將報文后綴改為info2.php 發送到服務器。
將info.php修改為info.jpg,如下所示。
bp開啟攔截功能,firefox瀏覽器開啟代理。
將info.jpg上傳,并使用bp抓包,同時將報文發送給repeater。
接下來將info.jpg改名為info2.php。
如下所示,點擊發送后上傳成功。
訪問info2.php,如下所示。