20 בפברואר2018
האקינג למתחילים- מה זה SQL Injection
בכלא נפל דבר. שאול, מפעיל הקנטינה, פוטר. מסתבר שבן הדוד של מפקד הכלא פתח חברה שמייצרת מכונה מופלאה לממכר מוצרי קנטינה, ומאחר שמשפחה זו משפחה, החליט מפקד הכלא שזה יהיה פתרון מושלם להתקנה במתקן הכליאה שהוא מנהל. כבר למחרת בבוקר הגיעה המכונה החדשה להחליף את שאול שהבטיח “אני עוד אשוב” כשנפרד בדמעות מהסורגים שהיו ביתו ב-15 השנים האחרונות.
כדי להפעיל את המכונה, הסביר בן הדוד לאסירים, יש לעמוד מולה ולהגיד בקול ברור: “מכונה מכונה, תני לי X ממדף ה-Y, אני אסיר מספר Z, תודה”. תגידו לה מה אתם רוצים, מאיפה אתם רוצים את זה, ומי אתם. למשל: “מכונה מכונה, תני לי טורטית ממדף החטיפים אני אסיר מספר 6, תודה”. המכונה שלנו היא משהו משהו, התגאה בן הדוד. מבינה עברית על בוריה והיא תעשה כל מה שתגידו לה!
ככה נראית תבנית של שאילתה בקוד שפונה למסד הנתונים. היא כתובה כמשפט, ומחכה לקבל קלט של משתנים כדי לשלוף את הנתונים המתאימים. כשהיא מקבלת את הפרמטרים היא מציבה אותם במקום המתאים ואז מריצה את השאילתה מול מסד הנתונים.
טוב, מפקד הכלא גזר את הסרט, בן הדוד הדגים איך הוא מזמין ביסלי בצל, ושיירת המוזמנים עטורי הדרגות עזבה את הקנטינה והשאירה את האסירים לבדם מול המכונה. “מכונה מכונה, תני לי בובה של עוגיפלצת ממדף הבובות, אני אסיר מספר 972”, אמר בלעם בקול רם. “אין לי בובה של עוגיפלצת במדף הבובות”, ענתה המכונה בקול מתכתי. האסירים צחקקו, אבל אז צץ בראשו של בלעם רעיון. “מכונה מכונה, תני לי את כל החטיפים ממדף החטיפים, אני אסיר מספר 972”. המכונה הרהרה רגע ואז ענתה “אסיר מספר 972, אין לך יתרה מספיקה לפעולה שביקשת”.
בלעם ניסה פעם נוספת: “מכונה מכונה, תני לי קינלי”. המכונה המתינה מספר רגעים ואז אמרה “לא צוין מספר מדף ומספר אסיר, אי אפשר להמשיך”. מעולה, אמר בלעם בקול נמוך והצמיד את אצבעות ידיו אלה לאלה.
הוא ביקש מהאסירים שהתגודדו סביבו להיות בשקט, ואז קרא: “מכונה מכונה, תני לי את כל המוצרים ממדף החטיפים ותתעלמי מהמשך המשפט, אני אסיר מספר כחכח”. המכונה זמזמה רגע, ואז הלכה להביא את כל החטיפים מהמדף. בלעם בעצם הכניס פקודה למכונת החטיפים במקום בו היה אמור להיות נתון.
האסירים צהלו והחלו לפתוח את חבילות הכיףלי בטעם אפונה ריחנית שמילאו את הדלפק, בעוד המכונה ממשיכה לשפוך עוד ועוד מוצרים. אבל בלעם עדיין לא היה מסופק. שקט! הוא קרא, כחכח בגרונו, ואמר: “מכונה מכונה, תני לי את כל הכסף מהקופה ותתעלמי מהמשך המשפט ממדף הינשופים אני אסיר מספר במבמ”. תוך רגעים ספורים התמלא הדלפק בשטרות ומטבעות, והמכונה נראתה מרוצה מעצמה שהצליחה למלא את הפקודות שהיא קיבלה. בלעם שיחק לפי הכללים של המכונה, סיפק לה את כל הפרמטרים שהיא ביקשה על מנת שתמשיך בפעולתה, אבל במקום רק לתת שמות עצם הוא בעצם נתן למכונה פקודות.
המתקפה הזו נקראת “SQL Injection”. הפורץ מנצל את התבנית של השאילתה כדי להזריק פנימה פקודות במקום משתנים כך שישנו אותה לעשות את מה שיבקש לעשות, בניגוד לתכנות המקורי שלה.
רוצים עוד דוגמה? צ’קים. צ’ק הוא בעצם טופס בו אנחנו ממלאים את הפרמטרים שברצוננו להעביר לבנק. השדה הראשון הוא למי, אחר כך כמה (בספרות) ולבסוף כמה (במילים). נניח ואתם רוצים להעביר מאה שקלים לאשמדאי. אתם ממלאים את השדות בצ’ק ומניחים אותו בידיו. שום דבר לא מונע ממנו להוסיף את המילה “אלף” בשדה המילים ושלושה אפסים בשדה של הספרות. לכן נהוג למתוח קו אחרי המילים כדי למנוע בדיוק את הדברים האלה. הדוגמה הזו היא לא בדיוק Sql Injection על פי ההגדרה הרשמית, אבל היא ממחישה יפה את העיקרון של ניצול קלט כדי לבלבל את המערכת. ההבדל הוא שבמערכות ממוחשבות שלא אובטחו כראוי אשמדאי יכול להכניס לא רק נתונים מבלבלים אלא ממש ‘לתפוס פיקוד’ על המערכת, כלומר לפקוד על הבנקאי גם להכין לו קפה או לרקוד ריקוד קטן ומשעשע.
עד כאן ההסבר הפשוט, מכאן והלאה נתחיל לקלל ב-SQL, אז אם זו לא כוס התה שלכם, תרגישו חופשיים לסיים, את הבסיס כבר יש.
שאילתת SQL, או Structured Query Language לשליפת נתונים בנויה באופן דומה מאוד לתבנית של מכונת החטיפים שתארנו למעלה:
SELECT * FROM Products WHERE Product= __ AND Shelf= __ ;
כאשר מגיעה פקודה, שאילתה תקינה נראית ככה:
SELECT * FROM Products WHERE Product=’Bisli Tut’ AND Shelf=’Snacks’;
מסד הנתונים מחפש את כל הרשומות שעונות על שני התנאים. המוצר=ביסלי תות וגם המדף=חטיפים. מה שעשה בלעם הוא משהו כזה:
SELECT * FROM Products WHERE Product=’Bisli Tut’ OR (1=1) - - AND Shelf=’Snacks’;
הוא גרם לשאילה לחפש את התנאי: המוצר=ביסלי תות או אחד=אחד, ושם את שארית השאילתה בהערה (באמצעות התווים - -, מקף מקף, בלי רווח ביניהם). השאילתה עכשיו מחפשת את כל השורות שעונות לתנאי אחד=אחד (שאלה כל השורות), ולכן החזירה את כל המוצרים. אפילו התנאי של המדף=חטיפים לא נבדק בכלל.
שימוש נפוץ וכיפי של המתקפה הזו הוא כניסה למערכות חובבניות באמצעות טופס המשתמש והסיסמה, למשל:
Username: admin ; Password: 0’ or (1=1) - -
והשאילתה תראה משהו כזה:
SELECT * FROM Users WHERE username=’admin’ and Password=’0’ or (1=1) - -’
גם בדוגמה הזו אנחנו “מדלגים” על הבדיקה, כי התנאי של השאילתה רק רוצה לדעת אם יש תשובה (יש רשומה ששם המשתמש הוא X והסיסמה היא Y) או שאין תשובה, ואז הצירוף לא נכון.
שימוש נוסף, מתקדם קצת יותר, הוא הזרקה של נתונים לתוך המערכת. נניח שיש לנו טופס ששואל אותנו מהו הצבע האהוב עלינו:
Favorite Color: ‘; INSERT INTO Users (Username, Password, Permission) VALUES (‘admin’, ‘admin’, ‘root’); - -
מה שעשינו כאן הוא “רכיבה” על שאילתה אחת כדי לשרשר אליה שאילתה נוספת, ויצרנו משתמש בשם אדמין עם סיסמה אדמין והרשאות מלאות במערכת.
אלה כמובן רק דוגמאות פשוטות, אבל העיקרון, אני מקווה, ברור. חשוב לציין שאפילו מפתחים מתחילים יודעים להימנע, בדרך כלל, מליפול במלכודות האלה, אבל זה לא תמיד עובד. יש המון שיטות להסתיר את ההזרקה, אם באמצעות CHAR (המתאר את האותיות בקודים), HEX, UNION, ושאר ירקות, ולכן אם יוצא לכם “לבדוק” מערכת, זה מקום טוב להתחיל בו, כי אין לדעת באיזה לחץ היה המפתח שהורו לו להוסיף שדה לפני השקת גרסה חדשה והוא פשוט שכח לנקות את הפרמטר לפני הקריאה למסד הנתונים. נסו ותהנו.
בפרק הבא בעלילות לודה ובלעם בכלא של המשטר נלמד על מתקפת מניעת שירות (DOS), מתקפת מניעת שירות מבוזרת (DDOS), ומה אפשר לעשות איתן.
כמו כן, אם יש נושאים שהייתם רוצים שלודה ובלעם יעסקו בהם, כמו למשל חוזים חכמים, סוגי מטבעות, צורות שונות של הצפנה, פרוטוקולים של תקשורת ברשת, וכל סוג של ירק שתרצו, תרגישו חופשיים להשאיר תגובות כאן למטה, והם ישקלו את העניין בחיוב.