מה זה SQL Injection - החולשה שיכולה לחשוף מסד נתונים שלם¶
תארו לכם אתר עם טופס התחברות פשוט - שם משתמש וסיסמה. אתם מקלידים משהו קצת מוזר בשדה שם המשתמש, לוחצים כניסה, ופתאום אתם מחוברים לחשבון של מישהו אחר בלי לדעת את הסיסמה שלו. זה לא קסם, זו חולשה שנקראת SQL Injection, ובאמת דעתו זה נשמע.
אז מה זה בעצם קורה שם¶
כל אתר שיש לו התחברות, טופס חיפוש, או כל דבר שדורש לשמור מידע - סביר להניח שמאחוריו יש מסד נתונים, ורוב מסדי הנתונים "מדברים" בשפה שנקראת SQL. כשאתם מקלידים שם משתמש וסיסמה, האתר בונה משפט SQL ושולח אותו למסד הנתונים כדי לבדוק אם הפרטים נכונים. זה נראה בערך ככה:
הבעיה מתחילה כשהמפתח לא מטפל נכון בקלט שהמשתמש מכניס, ופשוט "מדביק" אותו למשפט ה-SQL בלי בדיקה. אם אתם, במקום שם משתמש רגיל, מכניסים משהו כמו ' OR '1'='1, המשפט הופך להיות:
והתנאי '1'='1' תמיד נכון. מסד הנתונים "חושב" שהתנאי התקיים, ומחזיר לכם משתמש - לפעמים את המשתמש הראשון בטבלה, שלא פעם הוא בדיוק חשבון המנהל.
עד כמה זה מסוכן באמת¶
זה לא רק עוקף התחברות. אם חולשת SQL Injection מנוצלת בצורה מתוחכמת יותר, תוקף יכול לקרוא כל טבלה במסד הנתונים - כתובות מייל, סיסמאות מוצפנות, פרטי אשראי, כל מה שהחברה שמרה שם. במקרים מסוימים אפשר גם למחוק נתונים, לשנות אותם, ובתרחישים הכי חמורים אפילו להריץ פקודות על השרת עצמו. זו הסיבה שהחולשה הזאת מככבת שנים ברשימת ה-OWASP Top 10, ולמה כל כך הרבה דוחות דלף מידע מתחילים בדיוק כאן.
למה זה עדיין קורה, למרות שהפתרון ידוע¶
זה השלב שבו אנשים שואלים אותי - רגע, אם זה כל כך ידוע, למה מפתחים עדיין נופלים בזה? התשובה היא שילוב של קוד ישן שאף אחד לא נגע בו שנים, מפתחים שלא קיבלו הכשרה מספקת באבטחה, ולחץ זמנים שגורם לאנשים "לחסוך" בבדיקות. אתרים גדולים עם תקציבי אבטחה ענקיים עדיין נופלים בזה מדי פעם, אז זו בהחלט לא בעיה שנעלמת.
איך מגנים על אתר מפני זה¶
הפתרון המקובל והכי אמין נקרא Prepared Statements - שאילתות מוכנות מראש. במקום להדביק את הקלט של המשתמש ישירות למשפט ה-SQL, מפרידים בין המבנה של השאילתה לבין הנתונים עצמם, כך שמסד הנתונים תמיד יודע להתייחס לקלט כאל טקסט רגיל ולא כאל פקודה. יחד עם זה, שכבות הגנה נוספות כמו אימות קלט קפדני והרשאות מצומצמות למסד הנתונים מקטינות עוד יותר את הסיכון.
איך לומדים לזהות את זה בעצמכם¶
הדרך הכי טובה להבין SQL Injection היא לא לקרוא עליו, אלא לנסות לנצל אותו בעצמכם - בסביבה חוקית שנבנתה בדיוק בשביל זה. כשאתם רואים בעיניים שלכם איך שינוי קטן בקלט הופך למשפט SQL שלם, החולשה הזאת כבר לא מרגישה מופשטת, היא הופכת למשהו שאתם באמת מבינים ברמת הקוד.
בקורס פריצת אתרים אנחנו קודם בונים אתר עם מסד נתונים אמיתי, כדי שתבינו איך שאילתות SQL עובדות מבפנים, ורק אחר כך עוברים לתקוף אותו בעצמכם - כולל שלב מתקדם יותר שבו לומדים גם טכניקות ניצול מורכבות יותר, לא רק את הבסיס.
לסיכום¶
SQL Injection היא אחת החולשות הוותיקות והמסוכנות ביותר באינטרנט, והיא עדיין רלוונטית לגמרי היום. ההבנה שלה היא לא רק כלי תקיפה - היא בעצם כלי הגנה, כי ברגע שאתם יודעים איך זה נשבר, אתם יודעים בדיוק איך לבנות קוד שלא נשבר ככה.
הצטרפו לקהילה בדיסקורד ותתחילו לתרגל את זה בעצמכם, שלב אחר שלב, יחד עם אנשים שלומדים את אותו הדבר.