在PHP中, show_source()函數(別名為highlight_file() )用於以帶有語法高亮的格式顯示指定文件的源代碼。它常被用於調試或展示代碼片段。然而,如果在調用show_source()時未對輸入路徑進行嚴格驗證,就可能引發路徑遍歷攻擊,從而導致敏感文件洩露,造成嚴重安全隱患。
路徑遍歷攻擊是指攻擊者通過操縱文件路徑參數,訪問服務器上原本不應公開的文件。攻擊者通常使用類似../的目錄跳轉符號,繞過訪問限制,讀取系統敏感文件(如/etc/passwd 、配置文件、數據庫連接信息等),造成信息洩露。
示例代碼:
<?php
if (isset($_GET['file'])) {
show_source($_GET['file']);
}
?>
如果沒有對$_GET['file']的輸入進行過濾,攻擊者可以通過如下請求訪問任意文件:
http://gitbox.net/script.php?file=../../../../etc/passwd
這樣會導致服務器直接輸出/etc/passwd文件內容,造成嚴重信息洩露。
限定訪問目錄<br> 只允許訪問預設目錄中的文件例如,將允許訪問的文件目錄定義為/var/www/html/sources/ ,任何請求都必須在該目錄下查找:
<?php
$baseDir = '/var/www/html/sources/';
if (isset($_GET['file'])) {
$file = basename($_GET['file']); // 僅保留文件名,避免目錄穿越
$path = realpath($baseDir . $file);
if ($path !== false && strpos($path, $baseDir) === 0 && is_file($path)) {
show_source($path);
} else {
echo "非法文件路徑!";
}
}
?>
過濾和驗證輸入
使用basename()函數移除路徑中的目錄信息。
結合realpath()驗證文件的真實路徑,確保文件位於指定目錄中。
驗證文件存在且是普通文件。
禁用用戶直接傳入路徑<br> 最好通過預定義的文件列表或者ID映射表來確定要展示的文件,而不是讓用戶直接傳遞文件路徑
關閉危險函數顯示<br> 在生產環境中,盡量避免公開源碼顯示功能,或者設置權限限制,防止未經授權訪問
show_source()函數本身並不帶有安全漏洞,但如果不謹慎處理輸入路徑,容易導致路徑遍歷攻擊,洩露服務器敏感信息。防範關鍵在於嚴格驗證用戶輸入的路徑,限製文件訪問範圍,避免任意路徑被傳入執行。通過上述措施,可以有效防止路徑遍歷攻擊,保障系統安全。