לדלג לתוכן

Command Injection – מתקפת הזרקת פקודות למערכת

מבוא

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

כיצד פועלת מתקפת Command Injection?

המתקפה מתאפשרת כאשר קלט משתמש מוכנס ישירות לקריאה לפקודות מערכת ב-PHP, כגון system(), exec(), shell_exec(), passthru(), ו- popen(). תוקף יכול להזין פקודות נוספות על ידי שימוש בתווי מפריד כמו ;, &&, |, או $(...).


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

אתר שבודק זמינות כתובת IP

<?php
if (isset($_GET['ip'])) {
    $ip = $_GET['ip'];
    echo "<pre>";
    system("ping -c 4 " . $ip);
    echo "</pre>";
}
?>

📌 מה הבעיה? הקלט מועבר ישירות לפקודת ping מבלי לבצע סינון, מה שמאפשר לתוקף להזריק פקודות נוספות.

כיצד תוקף יכול לנצל זאת?

אם התוקף מזין את הערך הבא:

127.0.0.1; whoami

הפקודה שתורץ על השרת תהיה:

ping -c 4 127.0.0.1; whoami

התוצאה: לאחר ביצוע ping, הפקודה whoami תופעל ותחשוף את שם המשתמש של השרת.


סוגי מתקפות Command Injection

1. הזרקת פקודה פשוטה עם מפריד ;

127.0.0.1; cat /etc/passwd

🔹 מאפשר לתוקף לקרוא את קובץ passwd ולראות משתמשים רשומים.

2. שימוש בצינורות (|) לביצוע פקודה נוספת

127.0.0.1 | ls -la

🔹 במקום לקבל תוצאות ping, התוקף מקבל את רשימת הקבצים בספרייה הנוכחית.

3. שימוש ב-$(...) להרצת פקודה בתוך פקודה

$(whoami)

🔹 מריץ את הפקודה whoami ומכניס את התוצאה ישירות לפקודת ping.

4. שימוש ב- && להרצת פקודות רצופות

127.0.0.1 && uname -a

🔹 יפעיל את ping ולאחריו יציג את פרטי מערכת ההפעלה.


כיצד למנוע Command Injection?

1. שימוש בפונקציה escapeshellarg()

$ip = escapeshellarg($_GET['ip']);
system("ping -c 4 " . $ip);

🔹 פונקציה זו הופכת את הקלט למשתנה בטוח, כך שלא ניתן להוסיף פקודות נוספות.

2. שימוש ב- preg_match() לאימות קלט

if (preg_match('/^[0-9\.]+$/', $_GET['ip'])) {
    $ip = $_GET['ip'];
    system("ping -c 4 $ip");
} else {
    die("Invalid IP address");
}

🔹 רק כתובות IP תקינות יורשו.

3. שימוש ב- escapeshellcmd()

$ip = escapeshellcmd($_GET['ip']);
system("ping -c 4 $ip");

🔹 מסנן תווים מסוכנים מהקלט ומונע הזרקת פקודות.

4. הגבלת הרשאות משתמש בשרת 🔹 הפעלת תהליכים עם משתמש מוגבל (www-data) ולא root תמנע הפעלת פקודות מסוכנות.

5. מניעת הצגת פלט ישיר 🔹 במקום להשתמש ב-system() או exec(), עדיף לשמור את הפלט לקובץ ולנתח אותו.


סיכום

📌 Command Injection היא מתקפה מסוכנת שיכולה להעניק לתוקף שליטה מלאה על השרת.

⚠️ מערכות לא מאובטחות מאפשרות לתוקף:

  • להפעיל פקודות מערכת.

  • לקרוא ולשנות קבצים.

  • לגשת למידע רגיש כמו סיסמאות והגדרות שרת.

הגנות מומלצות:

  • שימוש בפונקציות escapeshellarg() ו-escapeshellcmd().

  • אימות קלט באמצעות regex (preg_match()).

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

  • מניעת הצגת פלט ישיר מהפקודות למשתמש.

💡 אם אתה עובד עם קלט משתמש שמועבר לפקודות מערכת – הקפד לוודא שהוא בטוח!