
הטקסט המלא של הדקות הראשונות בהרצאה «פריצה לשרת SQL מהאינטרנט - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בסרט הזה אנחנו נלמד מה זה SQL Injection ואנחנו בעצם נקבל מידע מהשרת SQL שלא היינו צריכים לקבל אותו, נפרוץ לתוך שרת SQL.
זאת השיטה הכי הכי ידועה, הכי פופולרית והכי הרבה פריצות בעולם מתבצעות בשיטה זו והיא גם מביאה אותנו ישירות למידע.
זאת אומרת, אנחנו פורצים ישירות למאגר המידע של החברה דרך אתר אינטרנט של החברה וזה מה שאנחנו הולכים לעשות עכשיו.
יש פה הרבה הסברים, אנחנו נתחיל לראות בעצמנו. בואו ניכנס לשרת sql, הנה יש לי פה שרת sql ואנחנו מריצים סלקט, אנחנו בוחרים מטבלת פרודקטס בעצם עמודות name descriptions ו-keyboards.
תסתכלו, יש לנו טבלת פרודקטס, יש פה נניח שבע שורות, יכול להיות הרבה שורות ואנחנו רוצים לסנן רק מוצרים שיש בהם אות A בהתחלה.
זאת אומרת, אנחנו, אתם רואים, סיננו וקיבלנו ארבעה מוצרים. עכשיו, במקום אות A פה, המשתמש מכניס משהו משלו דרך אתר האינטרנט. בואו תראו איך זה עובד.
לדוגמה, אם אנחנו ניכנס עכשיו ונריץ את האתר, אתם תראו שמשתמש הרי נכנס לאתר אינטרנט, כותב נניח אות A, ויוצאים לו כל המוצרים שיש בהם אות A בפנים.
אתם שמים לב? זה בעצם אתר אינטרנט עושה בדיוק את מה שכתבנו פה. למעשה, אתר אינטרנט כותב במקומנו פקודות של SQL, אוקיי?
אתר אינטרנט כותב במקומנו פקודות של SQL ושולף נתונים מתוך SQL. אנחנו התחברנו כרגע ישירות למסד נתונים כדי לראות איך השיטה הזאת תעבוד.
אז הלקוח שמגיע, הוא כותב משהו באתר האינטרנט, אתר אינטרנט הולך לתוך ה-SQL, מחפש את זה, תריץ את השאילתה הזאתי מחפשת זה ומביא לו תוצאות.
יפה מאוד. מי שלא יודע sql בכלל הוא חייב להכיר קצת sql לפחות תראו כמה הרצאות ראשונות בתוך קורס sql.
אני לא יכול להסביר לכם את כל ה sql עכשיו על רגל אחת אז אני מניח שאת הבסיס לפחות את הבסיס אתם כבר מכירים. מי שלא מכיר את הבסיס חייב לראות כמה הרצאות על sql.
באופן כללי האקינג מניח שאתם מכירים את המערכת שאתם פורצים עליה ואת המערכת שאתם מנסים להגן עליה, הרי אנחנו פורצים כדי ללמוד להגן, אוקיי?
אנחנו נלמד היום גם שיטות פריצה וגם שיטות הגנה נגד הפריצה הזאת. דרך אגב, הפריצות של SQL Injection הן מאוד ותיקות ועדיין הן הכי יעילות שאני מכיר.
זאת אומרת, הן ממש שולפות לכם נתונים ישירות. עוד מעט אנחנו נשלוף פה פרטים סודיים על המשתמשים ועל הלקוחות ואפילו כרטיסי אשראי, תחכו ותראו.
אז אמרנו דבר כזה, שפה הבן אדם כותב משהו והאתר האינטרנט הזה הולך דאטאבס לsql, למסד נתונים של sql ומריץ שם שאילתה ומביא לו נתונים חזרה למסך, אוקיי?
יפה. עכשיו יש לנו פה כמה כלים שיעזרו לנו לראות מה קורה מאחורי הקלעים. אני אראה לכם את הכלים או שאני אסביר לכם את השיטה? אתם יודעים מה? אני אתחיל בשיטת פריצה ואחרי זה אני אספר לכם על הכלים.
אז תראו מה השיטה אומרת. בואו ננסה להריץ עכשיו פה בחלק הזה. נכון שאני פה כותב מה שאני רוצה, אני רוצה פעם עוד A, פעם עוד B, זאת אומרת החלק הזה בפקודה של SQL מגיע מהמשתמש.
עכשיו המשתמש יכול לנצל את הזכות שיש לו פה להכניס נתונים ולעשות משהו לא יפה. מה הוא יעשה? עוד שנייה אני אספר לכם. בואו לפני שאני זה, אני אגיד לכם ש-SQL אפשר לרשום פקודות ברצף אחד אחרי שני עם נקודה פסיק ביניהם.
לדוגמה אני יכול לעשות סילקט, נניח אחד, כן? זאת אומרת זה יעשה לי קודם סלקט הזה, יוציא לי טבלה אחת, אחרי זה יוציא לי טבלה אחרת. תסתכלו, אתם רואים?
הוא נתן לי טבלה אחת, עכשיו טבלה אחרת, כן? כאילו אפשר לעשות רצף של פקודות, כאשר ביניהם נקודה פסיק, אוקיי? אני יכול גם לעשות עוד פקודה פה.
לדוגמה, אני יכול לעשות פה פקודה שנקראת wait for, wait for זה תמתין, כן? delay, ולהגיד לו כמה זמן אני רוצה שהוא יחכה.
לדוגמה, אני אומר לו 0 שעות, אפס דקות וחמש שניות. הפקודה הזאתי לבד פשוט עושה, ממתינה חמש שניות, תסתכלו.
אתם רואים? קווירי רץ 3, 4, 5, ואז הסתיים. הפקודה הזאתי בנפרד עושה לי דיליי של חמש שניות. הפקודה הזאתי עושה לי סתם מדפיסה ל-1 על המסך.
אתם רואים? 1 על המסך. ואני שמתי ביניהם נקודות פסיק. כך עובד SQL. זה שפה סטנדרטית. Standard Query Language הזה עובד על כל המערכות בעצם.
אז אני עושה פה execute, להריץ את זה והכל מתעכב לי 5 שניות ובסוף יש לי תוצאה, טבלה ראשונה וטבלה שנייה. אוקיי, איך אני הולך לנצל את העובדה הזאת?
תסתכלו מה אני עושה. אני פה מוציא תוצאות של search, לפה אני יכול להכניס מה שבא לי, אוקיי? אז תראו מה אני עושה. אני לוקח, לוקח את כל הפקודה הזאת ואומר דבר כזה, פה אני יכול להכניס מה שאני רוצה, נכון? כי זה ה-search שאני כותב בתיבת טקסט, אתם זוכרים, כן?
זה בעצם החלק הזה, זה למעשה ה-search שאני כותב כאן. אני יכול פה לכתוב AA, אני יכול לכתוב מה שבא לי.
אוקיי? יפה. אז מה שאני עושה זה דבר כזה, אני אומר ל-SQL חמוד, אתה רואה הגרש מסיים את הפקודה. אני אומר לו, הפקודה שלך פה הסתיימה.
הוא חושב שהפקודה הסתיימה, למרות שבפועל היא מסתיימת אחרי זה. נקודה פסיק ו-wait for 5 שניות. למעשה אני גורם ל-SQL לחשוב שהחלק הזה שאמור להיות חלק של נתונים הפכתי אותו לפקודה אוקיי זאת אומרת זה אמור להיות אזור שבו אתה מקבל משהו מהמשתמש ומחפש את זה זה אמור להיות נתון הנתון אסור לו להיות מורד זה לא קוד שמריצים אותו וגם
אם אני אכתוב פה כל מיני פקודות הוא לא יבצע אותם אוקיי הוא לא אמור לבצע אותם אפילו שזה פקודה למה כי זה אזור למידע בלבד אני לוקח את האזור למידע בלבד ופתאום הופך אותו למה?
לאזור של קוד. איך אני עושה את זה? אני בעצם שם תיק, גרש. הגרש הזה אומר ל-SQL, נגמרה פה האזור של החיפוש, כמו שזה היה במקור, זוכרים? הרי במקור האזור של החיפוש נגמר בגרש הזה, אוקיי?
ככה עושים חיפוש, כן? אומרים בין גרש לגרש, ואחוז, דרך אגב, אומר מה שאתה רוצה. זאת אומרת, כשאני כותב פה a,a,a, אני אומר מה שאתה רוצה לפני, מה שאתה רוצה אחרי, ובאמצע שחייבת להיות אות A, אוקיי? יופי.
בואו נעשה, אתם רואים? איפשהו פה באמצע, בכל אחד מהם פה אות A, פה אות A, יש אות A. יופי. אם אני אעשה סתם אחוז, אז הוא יכניס, הוא יראה לי הכל, כי זה בעצם הכל, אוקיי?
אז אחוז אומר לו תחפש הכל, אבל במקום AAA אני שם לו גרש, שפתאום אני הופך את אזור הנתונים לאזור של הפקודות, כי סיימתי כביכול, זייפתי לו. אחרי זה אני אומר לו בא פקודה הבאה ונותן את הפקודה שבאה לי.
ועוד מעט נראה איזה פקודות אני יכול לתת. עכשיו כדי שהדבר הזה לא יעשה לנו בעיות יש פה המשך של פקודה המקורית הוא יכול לעשות לנו בעיות כי פתאום זה לא מתאים לשום דבר והשארה תיפול כן כי השארה לא ידע מה לעשות עם הדבר הזה.
אז אנחנו נוסיף לו פה שני מינוסים שני מינוסים כאלו אומרים לsql שמעכשיו זה סתם הערות של משתמש סתם הוא כתב לעצמו כל מיני דברים בצד.
אז למעשה אני הולך להכניס את כל זה לאזור של search. הבנתם? לאזור של search. אני עושה לזה קרופי, לכל הפקודה הזאת אני עושה קרופי, ומכניס אותה בעצם באתר אינטרנט.
זאת אומרת, אני מגיע לאתר אינטרנט שאני רוצה לבדוק האם אפשר לפרוץ אותו בעזרת SQL injection, ואנחנו נראה גם אחרי זה, יותר מאוחר, איך אפשר לעגן, אוקיי?
ואני מכניס את זה בתוך ה-search. אני אומר לו, תסגור את השאילתה, תפתח פקודה חדשה שעושה המתנה של 5 שניות, תמתין חמש שניות, אני רוצה לראות ככה, אם יש לי המתנה בפועל של חמש שניות זה אומר שהפקודה רצה, אם הפקודה הזאת עובדת ורצה וממתינה חמש שניות אני ממשיך מה שנקרא לתקוף את האתר,
אם זה לא יעבוד זה אומר שהוא מוגן נגד התקפה מהסוג הזה, אוקיי? ואחרי זה שכל שאר הקוד לא יפריע לי, קוד של הערה.
יופי, בואו ננסה את זה, search, תראו באמת האתר מתעכב חמש שניות, תסתכלו טוב טוב טוב טוב טוב, האתר מתעכב חמש שניות ואז נתן לי תוצאה, זה אומר שהאתר הזה, אפשר לתקוף אותו בשיטה הזאת, בשיטת SQL Injection.
עכשיו בואו נראה, טוב, זה אחרי זה אני אספר לכם את הכלים שיש לי. אז הבנתם את הפריצה? הפריצה מבוססת על זה שקוד של המשתמש, בעצם הקוד של המשתמש, מוכנס כטקסט בתוך אזור הנתונים.
מה שהכנסת זה מה שהולך לפה לאזור של הנתונים, ובמקום הנתונים הלגיטימיים הוא מכניס סימן מיוחד שמסיים את הפקודה שאסור בעצם להכניס את הסימן הזה.
ואז סימן שאומר פקודה הבאה ומריץ את הפקודה הבאה. יפה. עכשיו, אם אני אגיד שאסור להכניס סימנים כאלו, תהיה לי בעיה.
יכול להיות שבשם של בן אדם או בשם משפחה שלו יש גרש או בכתובת שלו יש גרש, כן? או שאני לא רוצה בעצם להגביל את המשתמש או לגרום לו אי נוחות שהשם שלו לא נכתב כמו שצריך, או הרחוב שלו, או כאלו דברים.
אז אני לא רוצה למנוע את הגרש, ומה שכן אני יכול לעשות, יש מה שנקרא Escaped Characters. Escaped Characters זה אומר, כשאתה שם שני גרשיים, אז הוא הופך אותם לגרש אחד.
זאת אומרת, ב-SQL חשבו על זה, ואמרו, מי שרוצה לשים גרש באמצע הטקסט, שישים שני גרשיים, כן? שני גרשיים. זאת אומרת, אני שמתי שני גרשיים. יופי, זה בעצם פותר את הבעיה.
ככה פותרים את הבעיה. אבל, חכו שנייה, נגיע עוד מעט איך אנחנו נפתור אותה יותר יפה, אבל זה בעיקרון הפתרון של הבעיה, לזהות שיש גרש בודד בתוך הקוד, ולשים שני גרשיים.
עכשיו, אנחנו לא רוצים לעשות את זה לבד, אנחנו לא רוצים לעשות את הפעולה הזאת ידנית, כי זה יכול לגרום לבעיות ואפשר להתחכם. אז יש לנו קוד שעושה את זה באוטומט, ותכף אני אראה לכם איך עושים את זה נכון.
בואו נראה בעצם את הכלים שיש לי, אוקיי? קודם כל ככה, יש לי כלי מאוד מאוד חזק שנקרא SQL Profiler, ששם אני רואה כל מה שרץ על SQL.
בתוך ה-SQL, אם אתם תיכנסו, יש הרבה כלי עזר. אני חושב שיש את זה רק ב-SQL המלא, גם ב-2008, גם ב-2003, גם ב-2012, יש את הכלים, חוץ מ-Management Studio, שזאת הסביבה שאני עובד איתה.
עכשיו יש גם מה שנקרא הרבה כלים נוספים ואנחנו רוצים כלי שנקרא פרופיילר כלי שנקרא פרופיילר מראה לי כל פקודה שמורצת בשרת sql אז אני עושה מריץ אותו אומר לו פייל ניו טרייס בעצם מעקב חדש ובטרייס הזה אני אומר לו לאיזה שרת להתחבר ובטרייס הזה אני יכול להגיד לו תעקוב אחרי
הכל אני לא רוצה לעקוב אחרי הכל כי אצל לי כל מיני נתונים הפנימיים שלו אני רוצה להגיד לו שיסנן מידע רק כשיגיע ממשתמש שקוראים לו אדמיניסטרטור, שזה אני, אני עובד תחת אדמיניסטרטור.
למה? כי יש לו גם יוזר פנימי שלו שמריץ כל מיני פקודות שלא יפריע לי על המסך. אדמיניסטרטור, לא חייבים לעשות את זה? פשוט עשיתי סינון עמודות לפי יוזרנם אדמיניסטרטור.
יופי. רק דברים שאני אריץ את הקוד ולא הדברים הפנימיים שלו. ואודיטינג, לא צריך לתעד לי אודיטינג.
זה אומר מי נכנס, מי יצא, לוגין ולוגאוט. רק את ה-Batchים, את הפקודות, את ה-RPC ו-Existing Connections, הכל בסדר. יופי, יופי, יופי. נעשה run.
אנחנו מתחילים לעקוב אחרי כל הפקודות שמגיעות לשרת. לדוגמה, בואו נריץ את הפקודה הזאת. תראו, אתם יכולים לראות שה-Batch התחיל, הפקודה התחילה, והנה הפקודה הסתיימה.
לקח לה 5000 מילי שניות, שזה ואחת. זאת אומרת, 5,000, 5 שניות, מי הריץ אותה, מאיזה שרת וכו'. ופה אנחנו רואים את הפקודה שרצה. אתם רואים? יפה.
אז ככה אפשר לעקוב אחרי שרת SQL ולראות בדיוק איזה פקודות מריצים עליו. למקרה שיש לי חשד שמישהו מריץ משהו לא חוקי, אני יכול לעקוב אחרי SQL, מה מתבצע שמה.
במציאות זה ירוץ לכם פה אלפי שורות בדקה, כי השרת כל הזמן עובד, ואפשר את הטרייס הזה לשים בטבלה אחרת, לא רק על המסך בטבלה ולשמור את זה בטבלה אם תסתכלו פה אתם יכולים לשמור את זה בטבלה פה סייף טו טייבו ואז לנתח אחרי זה זאת אומרת להגיד לsql תשמור את זה בטבלה אחרת להגיד לו באיזה טבלה אני רוצה באיזה דאטה בייס אני רוצה ולנתח אחרי זה אז יפה אבל בשרת שלנו זה רץ
לא רץ פה שום דבר אז נורא כיף לנו ככה להסתכל על זה ולא לחפש במיליון שורות את השורה שאנחנו צריכים זה למעשה עבודה של אנשי DBA ואנשי אבטחת מידע.
אפשר לעבור על כל הפקודות שרצו בשערת SQL ולזהות את הבעיה. יפה. אז אמרנו כזה דבר, שאנחנו באזור של ה-search מכניסים גרש שמסיים, נקודה פסיק שמתחילה פקודה חדשה ופקודה שמעכבת בחמש שניות.
בסדר. ואחרי זה מתעלמים מכל מה שהיה במקור שמה, כדי שלא יפול השרת, כן? כי הפקודה לא תהיה חוקית, כי יש שם כל מיני דברים שהיו של הפקודה המקורית שלא יפריעו לנו.
ברגע שאני מזהה שהדבר הזה עובד, הנה, דרך אגב, אתם יכולים לראות פה, תסתכלו, אתם רואים? שזה אותו דבר. שרת SQL לא אכפת לו אם זה אתר אינטרנט שהריץ את זה, אם זה הריץ את זה בן אדם מתוך כזה כלי שמייקרוסופט נותנים לנו, שזה Management Studio מאוד נוח.
לא מעניין את השרת. SQL זה סרוויס שרץ ברקע, מי שפונה אליו בשפת sql מקבל תשובה זה מה שמעניין אותו לא מעניין אותו האם אתה מציג את זה כאפליקציה לאייפון או שזה אתר אינטרנט או שזה תוכנה בתוך המחשב שמוציגה נתונים לאיזה מנהלת חשבונות זה לא מעניין אותו פנית אליו בשפת sql הוא נתן לך תשובה התחלת בשעה כזאת וכזאת הסתיים בשעה כזאת וכזאת ככה צרכת מעבד
ככה פנית להרדיס ככה כתבת וככה זמן זה לקח 5000 על פיות השנייה זה 5000 שניות ואתה רואה פה את כל הפקודות בדיוק מהריץ ומה הוא עשה זה כלי מאוד מאוד חשוב דרך אגב לזהות דברים שלוקחים הרבה זמן בשרת נניח שרת לא זז sql אני מריץ את הדבר הזה ואני רואה פה מה לקח לו הכי הרבה זמן יאללה בוא נלך עכשיו ונמשיך הלאה אז גילינו שהסירט שלנו מצליח לנו יפה מאוד הסירט שלנו
מצליח לעכב את השרת זה אומר שיש לנו אפשרות להריץ פקודות משלנו עוד אחרי מעט אני הולך להסביר לכם איזה פקודות אפשר לעשות ולהסביר לכם על כל מיני פקודות מאוד מאוד יפות שאנחנו נשלוף פה הרבה נתונים אבל בשלב הזה כולם רוצים לדעת איך מגינים נגד זה יפה אז יש יש תסתכלו search better תכף אני אראה לכם מה זה עושה למעשה אם אתם תסתכלו
בקוד בואו נעצור שנייה את התוכנה אני אראה לכם מה קורה פה בקוד ואחרי שאנחנו נדבר על קוד השלב הבא אנחנו נדבר בעצם על פקודות ששולפות נתונים מתוך ה sql כן איך אני שולף ממש איזה טבלאות יש לו ואיזה עמודות יש לו ומה קורה שמה בפנים תראו אז אז פה בקוד
אז פה בקוד מה שקורה זה דבר כזה כן אם אתם תסתכלו מה שקורה פה בקוד שהשליטה שנשלחת לשרת כן יש לנו פה בעצם הדפסה שלה אנחנו יכולים גם לראות אותה מה שקורה זה שמה שהמשתמש הכניס אתם רואים search text, search text זה השדה שהמשתמש הכניס אותו.
הוא נכנס לכאן, אוקיי? זאת פקודה Select, כל הפקודה הזאת, איפה שהשם like ומה שהמשתמש הכניס, או keyword, לא משנה, זה עוד עמודות, אפשר לחפש לפי עמודות נוספות, אוקיי?
ולעשות מיון לפי משהו, להחליף גם את המיון אם אתם רוצים. הנקודה היא הכי חשובה זה כאן, שמה שהמשתמש הכניס נכנס as is ל-search. יופי, מה האופציה האחרת?
אפשרות אחרת לעשות את זה בעצם להשתמש במנגנון ש.NET נתנו לנו ולעשות את זה עם פרמטרים. תסתכלו מה זה הפרמטרים. אני יכול להגיד לו ששאילתא E אותו דבר, רק פה נכנס שטרודל משהו, שטרודל פרודקט ניימינג, שטרודל משהו.
השטרודל משהו זה פרמטר, שאת הפרמטר הזה אני כותב כאן שהפרמטר זה למעשה מה שהמשתמש הכניס. זאת אומרת את מה שהמשתמש מכניס, אני מעביר אותו לפרמטר אתם רואים פרמטר סאד כפרמטר בשם שטרודל פרודקט ניים ובשאילתה אני אומר להשתמש לה בפרמטר עכשיו מה ההבדל בין זה שהייתי לוקח את הסורצ' טקסט הזה ומכניס לפה לבין זה שאני מכניס
את הסורצ' טקסט לפרמטר של sql והפרמטר של sql נכנס לתוך השאילתה לכאן הרי זה די אותו דבר נכון חוץ מעובדה שהsql מספיק חכם למנוע בפרמטר שאמור להיות מידע מלכתחילה כי זה אמור להיות מידע זה פרמטר של מידע להפוך אותו לפקודה