Path Traversal – מתקפת מעבר נתיבים¶
מבוא¶
חולשת Path Traversal (או Directory Traversal) היא חולשת אבטחה המאפשרת לתוקף לגשת לקבצים רגישים בשרת על ידי שימוש בנתיבים יחסיים כמו ../ כדי לנווט מחוץ לתיקייה המותרת. ניצול החולשה יכול להוביל לקריאת קבצים סודיים, שינוי קבצים קריטיים, ואף להרצת קוד זדוני.
כיצד מתקפת Path Traversal עובדת?¶
במערכות קבצים, הנתיב ../ משמש לחזרה לתיקייה הקודמת. כאשר שרת אינטרנט לא מסנן נכון את הקלט מהמשתמש, תוקף יכול לנצל זאת כדי לגשת לקבצים מחוץ לתיקייה המורשית.
1. קריאת קבצים רגישים¶
דוגמה לקוד PHP פגיע¶
<?php
if (isset($_GET['file'])) {
$file = $_GET['file'];
$path = "uploads/" . $file;
if (file_exists($path)) {
echo file_get_contents($path);
} else {
echo "File not found!";
}
}
?>
📌 הבעיה:
- המשתמש שולט בערך
file, ולכן יכול לכתוב קלט כמו:
📌 התוצאה:
- השרת קורא את הקובץ
/etc/passwdומחזיר את תוכנו לתוקף.
🔴 דוגמאות לקבצים רגישים שניתן לקרוא:
-
/etc/passwd(לקריאת משתמשי המערכת בלינוקס) -
C:\Windows\System32\drivers\etc\hosts(לקריאת קובץ ה-hosts ב-Windows) -
config.php(לקריאת סיסמאות מסד הנתונים)
2. כתיבה לקבצים ושינוי נתונים קריטיים¶
דוגמה לקוד PHP פגיע להעלאת קבצים¶
<?php
if (isset($_FILES['file'])) {
$upload_dir = "uploads/";
$file_name = $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir . $file_name);
echo "File uploaded successfully!";
}
?>
📌 כיצד לתקוף? תוקף יכול לשנות את שם הקובץ בזמן ההעלאה:
💥 אם השרת לא מסנן נתיבים, ניתן להעלות קובץ PHP מחוץ לתיקיית ה-uploads ולבצע קוד זדוני.
3. ניצול Path Traversal עם Include ל-Remote Code Execution¶
דוגמה לקוד PHP פגיע עם include¶
אנחנו שולטים על page, אז אם נוכל להעלות קובץ כלשהו לאתר, נוכל להריץ אותו באמצעות הפקודת include!
📌 כיצד לתקוף?
📌 או אם allow_url_include מופעל בהגדרות הphp
ניתן לכלול קובץ מרוחק!
💥 כך ניתן להפעיל קוד זדוני ישירות בשרת!
כיצד למנוע מתקפות Path Traversal?¶
✅ 1. שימוש ב-realpath() כדי לוודא שהקובץ נמצא בתיקייה מורשית
$base_dir = realpath("uploads/");
$file_path = realpath($base_dir . "/" . $_GET['file']);
if (strpos($file_path, $base_dir) !== 0) {
die("Access denied!");
}
echo file_get_contents($file_path);
✅ 2. הגבלת שמות הקבצים לערכים קבועים מראש
$allowed_files = ['profile.jpg', 'document.pdf', 'image.png'];
if (!in_array($_GET['file'], $allowed_files)) {
die("Invalid file!");
}
✅ 3. שימוש ברשימת whitelist לקבצים מותרים במקום להסתמך על נתיב קלט מהמשתמש
$safe_pages = ['home', 'contact', 'about'];
if (!in_array($_GET['page'], $safe_pages)) {
die("Access denied!");
}
include("pages/" . $_GET['page'] . ".php");
✅ 4. הגבלת הרשאות לקבצים רגישים באמצעות שרת האינטרנט 📌 לדוגמה, בקובץ .htaccess:
✅ 5. השבתת allow_url_include ו-allow_url_fopen ב-PHP כדי למנוע inclusion של קבצים מרוחקים
✅ 6. הרצת השרת עם הרשאות מוגבלות כדי למנוע קריאת קבצים רגישים מחוץ לתיקייה המורשית
סיכום¶
🔴 Path Traversal היא מתקפה קריטית שיכולה להוביל ל:
-
קריאת קבצים רגישים.
-
כתיבה לקבצים קריטיים.
-
הרצת קוד דרך
include.
✅ כדי למנוע:
-
להשתמש ב-
realpath()כדי לוודא שהנתיב חוקי. -
להגביל את הקלט לערכים קבועים מראש.
-
להשבית פונקציות PHP מסוכנות.
-
להפעיל את השרת עם הרשאות מינימליות.
💡 אם אתה מפתח מערכת עם גישה לקבצים, וודא שאין אפשרות לנתונים חיצוניים להשפיע על הנתיבים הנקראים או המבוצעים!