כן, SQL injection חי ובועט

גלובוס מקס כלל פרצת SQL Injection - רציתם לדעת איך מגלים פירצה כזו? כאן אני מסביר.
sql injection example

המאמר התפרסם בגרסה למוגלגים בהארץ. פה יש את הגרסה הקשוחה למתכנתים.

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

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

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

פלט השגיאה שהתקבל – שימו לב ל Unclosed quotation mark

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

https://globusmax.co.il/movie-1109'

כל דבר שאני מוסיף אחרי הגרש ייכנס למסד הנתונים (רק לא לשכוח לסגור את הגרש או לבטל אותו עם "הערה") למשל משהו כזה:

https://globusmax.co.il/movie-1109' DROP DATABASE movies;--

אבל אנחנו לא עושים דבר כזה, ברגע שאנחנו רואים שגיאת SQL Injection, הדבר הראשון שאנו עושים זה לפתוח את לינוקס קאלי ולהפעיל את הכלי sql map. כתבתי עליו בעבר. זה כלי ממש ותיק וממש אמין. כל מה שהוא צריך זה URL שבו יש את הפגיעות והוא כבר יודע לבד לשתול את השאילתות ולשלוף את כל המידע שצריך וגם לתת לך אפשרות להכניס queries משלך. צפו בהדגמה הבאה למשל:

מפה כבר היה קל לשלוף את שמות הטבלאות של כל מסד הנתונים של גלובוס מקס ולקבל גישה לכל האתר. ומפה? מפה יש לתוקף את הכל. הוא יכול לשנות את תכני האתר (למשל להכניס איזה כורה מונרו שירוויח כסף) לנסות לתקוף משתמשים באתר (למשל להקפיץ להם פופאפ שמזמין אותם להתקין משהו) או לחלופין לגנוב את הפרטים שלהם כמקובל ולהשתמש בהם כדי לתקוף אותם בתקיפת המשך.

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

איך מונעים התקפות כאלו?

הדבר הראשון הוא לא להציג פלטי שגיאה ללקוח. בחייאת, זה ממש קל בכל שפה ובכל פלטפורמה להציג דף 500 אחיד ללקוח שאומר שהיתה שגיאה.

הדבר השני הוא מניעת SQL Injection. הדרך הטובה ביותר היא לעבוד עם prepared queries – יש את זה בכל שפה והפורמט די זהה. אני אציג עם הפסאודו קוד הג'אווהסקריפטי הבא:

var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);

בנוסף, ולידציה של כל המשתנים שמגיעים מצד הלקוח זה MUST. אם אתם משתמשים ב-prepared queries ובולידציה כמו שצריך – פתרתם את הבעיה. מנעתם הצגת שגיאות בפני המשתמש? מנעתם מהתוקף מידע שימושי.

זו פרצה בת 30 שנה בערך. זה לא יאמן שאנחנו מוצאים אותה עדיין.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

נגישות טכנית – פודקאסט ומבוא

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

גלילה לראש העמוד