✕ סגור 
צור קשר
תודה על ההתעניינות .

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form

אל תמהרו להספיד את ה SQL Injection

רן בר זיק
|
קלה
|
May 6, 2019
alt="facebook"alt="linkedin"להרשמה לניוזלטר

בכל פעם שאני מופיע בכנסי אבטחה שונים ומשונים, תמיד מתבאסים עלי כשאני מדבר על דברים טריוויאליים במקום על דברים ממש מגניבים וחדשניים באבטחת מידע. אבל מה לעשות שכל הפרצות שאני נתקל בהם באתרים שונים, הן פרצות בנות שלושים שנה לפחות? למה בדיוק כדאי לטרוח לפרוץ באמצעים מבריקים, כאשר רוב האתרים פריצים באמצעות 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 שנה בערך, וזה לא ייאמן שאנחנו מוצאים אותה עדיין.

מאת: רן בר זיק, מתכנת ובלוגר

בכל פעם שאני מופיע בכנסי אבטחה שונים ומשונים, תמיד מתבאסים עלי כשאני מדבר על דברים טריוויאליים במקום על דברים ממש מגניבים וחדשניים באבטחת מידע. אבל מה לעשות שכל הפרצות שאני נתקל בהם באתרים שונים, הן פרצות בנות שלושים שנה לפחות? למה בדיוק כדאי לטרוח לפרוץ באמצעים מבריקים, כאשר רוב האתרים פריצים באמצעות 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 שנה בערך, וזה לא ייאמן שאנחנו מוצאים אותה עדיין.

מאת: רן בר זיק, מתכנת ובלוגר

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
רן בר זיק
בואו נעבוד ביחד
צרו קשר