לדלג לתוכן

Insecure File Upload – העלאת קבצים מסוכנת

מבוא

העלאת קבצים היא תכונה נפוצה באתרים, אך אם היא אינה מאובטחת כראוי, היא יכולה להוביל לפריצות חמורות. מתקפה זו מתרחשת כאשר משתמשים יכולים להעלות קובץ זדוני ולבצע קוד שרת, להפעיל סקריפטים זדוניים, או להשיג שליטה מלאה בשרת.

סכנות בהעלאת קבצים לא מאובטחת

🔴 הרצת קוד זדוני – העלאת קובץ PHP שיכול לרוץ על השרת. 🔴 ביצוע JavaScript זדוני – העלאת קובץ HTML שמכיל JavaScript (Stored XSS). 🔴 גישה לקבצים רגישים – העלאת קובץ ZIP או TAR שמכיל סקריפטים לגישה למידע חסוי. 🔴 Denial of Service (DoS) – העלאת קובץ ענק כדי למלא את שטח האחסון של השרת.


דוגמה לקוד פגיע ב-PHP

<?php
if(isset($_FILES['file'])) {
    $upload_dir = "uploads/";
    $file_name = $_FILES['file']['name'];
    $file_tmp = $_FILES['file']['tmp_name'];
    move_uploaded_file($file_tmp, $upload_dir . $file_name);
    echo "File uploaded successfully: " . $file_name;
}
?>

📌 מדוע הקוד הזה פגיע?

  • כל קובץ מתקבל בלי בדיקה.

  • אין סינון סוג הקובץ.

  • אין בדיקה האם זה באמת תמונה או מסמך.

  • הקובץ נשמר ישירות בתיקיית השרת ויכול להתבצע אם זה קובץ PHP.


כיצד ניתן לנצל זאת?

1️⃣ העלאת קובץ PHP זדוני ניצור קובץ בשם shell.php עם הקוד:

<?php echo shell_exec($_GET['cmd']); ?>

ונעלה אותו לשרת. לאחר מכן נבצע פקודות דרך ה-URL:

http://example.com/uploads/shell.php?cmd=whoami

💥 אם זה עובד, יש לנו שליטה מלאה בשרת!

2️⃣ העלאת קובץ עם סיומת כפולה אם האתר בודק רק את הסיומת, נוכל להעלות קובץ בשם:

shell.php.jpg

ולגשת אליו ישירות בשרת.


כיצד להגן על האתר?

1. לבדוק את סוג הקובץ לפי MIME-Type

$allowed_types = ['image/jpeg', 'image/png', 'application/pdf'];
$file_type = mime_content_type($_FILES['file']['tmp_name']);
if (!in_array($file_type, $allowed_types)) {
    die("Invalid file type!");
}

2. להעלות קבצים עם שם רנדומלי ולשנות את הסיומת

$new_name = uniqid() . ".jpg";
move_uploaded_file($_FILES['file']['tmp_name'], "uploads/" . $new_name);

3. למנוע הרצת קוד בשרת על ידי השבתת PHP בתיקיית ההעלאות

📌 הוספת .htaccess בתיקיית uploads/:
בapache כאשר אנחנו מוסיפים קובץ .htaccess לתקייה מסוימת, אנחנו יכולים להגדיר מי יכול לגשת אליה, איזה קבצים מותרים וכו.

<FilesMatch ".*\.(php|phtml|php3|php4|php5|php7|phps)">
    deny from all
</FilesMatch>

באמצעות ההגדרה הבאה ב.htaccess שום סוג של קובץ php לא יוכל להיות בתקייה.

4. לבדוק את תוכן הקובץ, לא רק את הסיומת

if (exif_imagetype($_FILES['file']['tmp_name']) === false) {
    die("Invalid image file!");
}

5. להגדיר גודל מקסימלי לקובץ

if ($_FILES['file']['size'] > 2 * 1024 * 1024) {
    die("File too large!");
}

6. להריץ את האתר בהרשאות מוגבלות 📌 לוודא שהמשתמש שמריץ את השרת אינו root ואין לו הרשאות כתיבה לכל השרת.


סיכום

🔴 אתר לא מאובטח שמאפשר העלאת קבצים יכול להפוך לשרת תקיפה לתוקפים.

⚠️ תוקף יכול:

  • להעלות קובצי PHP כדי לקבל שליטה מלאה.

  • להעלות HTML עם JavaScript ולבצע XSS.

כדי למנוע התקפה:

  • לבדוק את סוג הקובץ לפי תוכנו ולא רק לפי הסיומת.

  • לשנות שמות קבצים ולהגביל העלאות.

  • למנוע הרצת קוד בתיקיית הקבצים שהועלו.

  • להשתמש בהרשאות שרת מוגבלות.