לדלג לתוכן

מה זה Command Injection - כשתוקף מקבל שליטה ישירה על השרת

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

אז מה זה בעצם קורה שם

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

הבעיה מתחילה כשהפקודה הזאת בנויה חלקית מקלט שהמשתמש שולט בו, בלי סינון מספיק. תארו לכם עמוד שנותן למשתמש לבדוק אם שרת מסוים זמין, על ידי הזנת כתובת IP. מאחורי הקלעים, הקוד בונה פקודה כמו:

ping -c 4 <כתובת שהמשתמש הזין>

אם המשתמש מזין כתובת IP רגילה, הכל עובד כמו שצריך. אבל אם הוא מזין משהו כמו 8.8.8.8; rm -rf /tmp/data, ואין סינון מתאים, מערכת ההפעלה תריץ את שתי הפקודות ברצף - קודם את ה-ping התמים, ואז את הפקודה השנייה, הזדונית, בדיוק כאילו התוקף ישב מול השרת עצמו והקליד שם פקודות.

עד כמה זה חמור

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

למה זה קורה בפועל

ברוב המקרים, הבעיה נובעת מהרגל מפתחים לבנות פקודות shell כמחרוזת טקסט פשוטה, ולשלב בה קלט של משתמש בלי לחשוב על ההשלכות. זה קורה הרבה יותר ממה שאנשים חושבים - בכלי ניהול פנימיים, בממשקי ניהול תוכן, בכל מקום שבו מישהו חשב "זה רק כלי פנימי קטן, מי בכלל יתקוף את זה". התשובה היא - מספיק שהוא נגיש דרך האינטרנט, וזה מספיק.

איך תוקף בכלל מזהה שיש כזאת חולשה

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

איך מגנים על שרת מפני זה

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

איך לומדים לזהות את זה בעצמכם

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

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

לסיכום

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

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