PracticU

פריצה לאתר אינטרנט - SQL injection - חלק 1

בלי כתוביותעם כתוביות
PracticU › קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP › פריצה לאתר אינטרנט - SQL injection - חלק 1
מילון מושגים:
אתר אינטרנט - אוסף של דפים ומשאבים מקושרים המתארחים תחת כתובת אחת ומוגשים דרך דפדפן.
SQL Injection - חולשה שבה קלט זדוני מוחדר לשאילתת SQL, ומאפשר לתוקף לקרוא או לשנות נתונים במסד.
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
שם משתמש - מזהה ייחודי שמשתמש מזין כדי להזדהות במערכת, לרוב יחד עם סיסמה.
חולשה - פגם או חולשה במערכת או בתוכנה שעלול לאפשר פגיעה באבטחה אם לא יטופל.
הרשאה - קביעה אילו פעולות ומשאבים מותרים למשתמש או לתהליך לאחר שזהותו אומתה. שולטת במי רשאי לעשות מה.

פריצה לאתר אינטרנט - SQL injection - חלק 1
ההרצאה פותחת סדרה על SQL injection, סוג של התקפה על אתרים שמחוברים למסד נתונים. המטרה היא להבין למה ההתקפה נפוצה, ואיך אתר נחשף אליה גם כשהמפתחים לא חושבים שיש בו בעיה.
איך ההתקפה עובדת
1. קלט שנכנס לשאילתה בלי סינון: האתר לוקח את מה שהמשתמש הקליד בטופס ומרכיב ממנו שאילתה למסד הנתונים. אם הטקסט לא מטופל כנתון בלבד, חלק ממנו נקרא כפקודת SQL.
2. השרת לא מבחין בהבדל: הטקסט והשאילתה נשלחים יחד, ומסד הנתונים מבצע את מה שמגיע אליו. לכן שדה רגיל כמו שם משתמש יכול לשנות את משמעות השאילתה.
3. סימן לחולשה: כששינוי קטן בקלט משנה את התנהגות האתר, או מחזיר הודעת שגיאה במקום תשובה רגילה, זה מעיד שהקלט לא מסונן.
4. התוצאה: דף כניסה פגיע עלול לאפשר כניסה לאזור ניהול בלי סיסמה תקפה.
איך מתגוננים
- שאילתות מוכנות מראש (parameterized queries): הקלט נשלח כנתון נפרד, ולכן אינו יכול לשנות את מבנה השאילתה.
- אימות קלט: לבדוק שהערך תואם לסוג הנתון שהשדה מצפה לו, לפני שהוא מגיע למסד.
- הרשאות מינימליות: לחשבון המסד שהאתר משתמש בו יש להעניק רק את מה שהאתר באמת צריך.
- הודעות שגיאה פנימיות: הודעת שגיאה של המסד שמוצגת למשתמש נותנת לתוקף רמזים על מבנה השאילתה.
אחרי ההרצאה ברור למה כל שדה שמשפיע על שאילתה צריך הגנה, גם בטופס שנראה פשוט.
השיעור הבא בקורס: פריצה לאתר אינטרנט - SQL injection - חלק 2

פרקי ההרצאה: פריצה לאתר אינטרנט - SQL injection - חלק 1

  1. 00:00

    מה זה SQL Injection ולמה הוא מסוכן

  2. 01:34

    הצגת תעבורת הדפדפן דרך שרת פרוקסי

  3. 04:13

    מבנה בקשת HTTP: שמות פרמטרים וערכים

  4. 05:07

    שיטות GET ו-POST וגוף הבקשה

  5. 09:06

    טבלת משתמשים במסד נתונים MySQL

  6. 10:05

    הזרימה בין שרת Web לשרת SQL

  7. 10:42

    שאילתת SELECT להתחברות לפי שם וסיסמה

  8. 13:38

    איפה נכנס קלט המשתמש לשאילתה

תמלול ההרצאה: פריצה לאתר אינטרנט - SQL injection - חלק 1

הטקסט המלא של הדקות הראשונות בהרצאה «פריצה לאתר אינטרנט - SQL injection - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    טוב חברים אנחנו מתחילים סדרת הרצאות על sql injection שזאת התקפה מאוד מאוד מאוד חזקה אחת החזקות ביותר שקיימות וזאת התקפה מאוד מאוד מאוד טובה ומאוד חזקה ומאוד יעילה היא עובדת באמת אפילו עד עצם יום הזה הנה אני אתן לכם דוגמה אתר אינטרנט אמיתי שפתוח באינטרנט האתר הזה נמצא בהונג קונג אתר אמיתי חשוף להתקפה הזאת שזה אתר אמיתי מכללה אמיתית מצאתי שהיא חשופה להתקפה הזאת שלא תחשבו שזה

  2. 00:34

    משהו שהוא תיאורטי בלבד ואנחנו נראה איך אפשר לנצל את ההתקפה הזאת כדי לפרוץ באמת לאתרים ואנחנו רוצים בעצם דרך sql injection להיכנס במקום username וpassword להכניס פה נניח אנחנו לא מכירים אנחנו לא יודעים מה לרשום אנחנו לא יודעים שם וסיסמה ואנחנו רוצים לתקוף ולהיכנס

  3. 00:55

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

  4. 01:25

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

  5. 01:47

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

  6. 02:12

    settings וקובע שאני רוצה פרוקסי אני הולך להיות פרוקסי של עצמי, שרת פרוקסי של עצמי ואני מוחק פה no proxy for כי אני בעצמי רוצה לעבור דרך עצמי אני מוחק את זה, מכניס פרוקסי ב-http ונשים port 8080, יש?

  7. 02:34

    אז 127.0.0.1 זה שרת פרוקסי 80.80 ו-NoProxy4 אני מנקה ועושה אוקיי. יופי, עכשיו יש לי שרת פרוקסי מוגדר ואני צריך להפעיל את הפרוקסי אחרת שום דבר לא יעבוד לי.

  8. 02:48

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

  9. 02:56

    בואו נפעיל שרת פרוקסי, יש הרבה תוכנות שעושות את זה. אנחנו נשתמש בתוכנה שנקראת BopSuite שהיא מובנית בתוך קאלי.

  10. 03:06

    נפעיל את ביורפ נעשה נקסט נקסט נקסט ועכשיו בלשונית של פרוקסי אינטרספט איז און זה אומר שהוא יעצור לי את הפאקט באופצ'נס שלו אני רואה שהפרוקסי אתם רואים פרוקסי באופצ'נס עובד בפורט 8080 שזה הדיפולט שלו הבקשות של הקליינט הוא תופס והתשובות של השרת הוא לא תופס אתם רואים סרבר ריספונסס הוא לא תופס אני שם לו v לתפוס רק כדי להראות לכם איך

  11. 03:37

    נראות התשובות של השרת בואו נראה ניכנס שוב לאותו הדף עושים enter והפעם הוא מסתובב והוא מחכה לתשובה מהשרת אבל השרת תפס את הבקשה כאן הנה זאת הבקשה לקחת איזשהו עמוד לוגין אוקיי אני עושה לו forward והנה התשובה של השרת בואו נראה עוד פעם אני עובר חזרה לפייר פוקס עושה פה אלקס 1234 לוגין עובר לשרת פרוקסי זה לא קשור זה לא יודע מה הוא שלח פה

  12. 04:20

    הנה הבקשה שלי שימו לב הבקשה אומרת שיש פה אלכס ופסוורד מה אנחנו לומדים קודם כל אנחנו חייבים להכיר איך נראית הבקשה אז שימו לב יש פה שם של הפרמטר ויש את הערך שלו שזה אלכס למעשה מה שאנחנו מכניסים בתוך טופס עובר בצורה כזאת שם של פרמטר שווה הערך שלו ומה קורה השרת שרת וב שזה יכול להיות שרת וב זה יכול להיות אפאצ'י בלינוקס או איי אס במיקרוסופט

  13. 04:53

    שרת איי אס במיקרוסופט או אפאצ'י בלינוקס לוקח את הבקשה הזאת ומקלף מתוכה את הערכים וניגש לשרת sql שואל את הsql את המסד נתונים תגיד לי זה באמת הנתונים הנכונים ואם זה נכון הsql מחזיר לו תשובה והוא מחזיר לי את התשובה אני בעצם מעביר בקשה לשרת עם הערכים האלו עכשיו שימו

  14. 05:18

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

  15. 05:48

    אין גוף אם הבקשה הייתה רק הדרים זה נקרא גט אם יש גט אז כל כל הפרמטרים האלו היו כתובים פה בתוך כתובת url בתוך הבקשה בתוך הurl היו כתובים כל הפרמטרים וזה היה נקרא get אז יש לנו בקשת פוסט עם הפרמטרים בגוף שלא רואים אותם בurl זה הurl יופי אני עושה forward ומקבל תשובה מהשר"ט שימו לב איזה תשובה מהשר"ט אני מקבל זה התשובות

  16. 06:19

    מהשר"ט שנייה הנה זאת התשובה כי היו שם כמה תשובות http://11200 זה הסטטוס אוקיי הדף תקין זה אומר שהדף נמצא אם דף לא נמצא הייתי מקבל לדוגמה 404 אני מקבל את כל ההדרים את כל ההדרים לדוגמה אם היה קוקי היינו רואים פה את הקוקים ואת הבאדי

  17. 06:43

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

  18. 07:10

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

  19. 07:31

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

  20. 07:42

    נלחץ כפתור ימני ו-send to repeater. רפיטר זה כלי שישלח בקשות, יקבל אותם חזרה. ישלח, יקבל אותם חזרה, והנה אנחנו עשינו את זה, ופה רפיטר הופיע למעלה.

  21. 07:54

    עכשיו אנחנו יכולים לשלוח בקשה ולקבל תשובה. לשלוח בקשה, לקבל תשובה. בואו נעשה go ו-render. ואנחנו רואים פה not logged in. notlogged in, אולי זה לא נראה יפה, זה אומר ששלחנו את הבקשה הזאת, קיבלנו את התשובה הזאת, החלק הזה נקרא חדרים, הנה אנחנו יכולים לראות אותם,

  22. 08:16

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

  23. 08:35

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

  24. 09:06

    רוצה לעצור פה האינטרספט איזוף בסדר אז אני כדי לדמיין את זה יותר נוח, אני אכנס ל-MySQL כדי שיהיה לנו יותר נוח לדמיין.

  25. 09:16

    PHP MyAdmin, שם וסיסמה זה מוטילידיי. זה יכול להיות כל בסיס נתונים, אני סתם נותן לכם דוגמא איך אני מדמיין דברים.

  26. 09:32

    יש לנו בתוך כלי ניהול של דאטאבייס, של שרת MySQL, הרבה דאטאבייסים, הרבה מסדי נתונים שנקראים סכמה. אנחנו נבחר לדוגמא את הדאטאבייס הזה, ובדאטאבייס הזה נבחר טבלת אקאונטס, זה הטבלאות.

  27. 09:48

    וזה הטבלה שאנחנו עכשיו מדמיינים מה עשה המתכנת. אם אני הייתי מתכנת, מה הייתי עושה אם הייתי מקבל את הפרמטר הזה ואת הפרמטר הזה כדי להחזיר לאתר אינטרנט תשובה אוקיי או לא אוקיי.

  28. 10:03

    ואז אתר האינטרנט, האפאצ'י OIS, מוסיפים לכל התשובה שלי את הגרפיקה של HTML. כל הנתונים יושבים בשרת SQL שאליו יכול לגשת רק שרת Web. אז שרת ווב, הקליינט ניגש לשרת ווב, ושרת ווב ניגש ל-SQL, לוקח את הנתונים, מוסיף על הנתונים הגולמיים את הגרפיקה שמתוכנתים אצלו בשרת ה-Web.

  29. 10:27

    שרת ווב, הדפים ששם, הקוד PHP או קוד .NET, זה בעצם הגרפיקה של האתר, אז הוא לוקח את הנתונים של SQL פלוס הגרפיקה שנמצאת אצלו מקומית בשרת ה-Web, עושה מזה סלט אחד גדול, ושולח לי את התמונה המוכנה כולל הנתונים וכולל הגרפיקה.

  30. 10:45

    מה הוא עושה כשמגיע אליו יוזרנם ופספורט? מה הוא עושה? שרת ה-Web. אז שרת ה-Web, אם אני הייתי המתכנת שלו, אז הייתי כותב בשפת SQL דבר כזה Select כוכבית.

  31. 10:54

    כוכבית זה אומר כל העמודות שיש בטבלה, ובטבלה אתם יכולים לראות שיש פה 1, 2, 3, 4, 5, 6, 7 עמודות. זה השמות של העמודות.

  32. 11:06

    אני אומר לו, תקשיב, תבחר לי את כל העמודות מטבלה שנקראת אקאונטס, עבור כל שורה, שימו לב, עבור כל שורה בטבלה אני בודק האם Username שווה ל-Alex and Password שווה ל-1234.

  33. 11:23

    זאת אומרת ש-SQL עובר על כל טבלת אקאונטס, על כל טבלת אקאונטס, ועבור כל שורה הוא בודק האם התנאי הזה מתקיים. האם בשורה מספר 2 שהוא נמצא כרגע, האם עמודה של Username זה באמת Alex?

  34. 11:39

    וגם הסיסמה היא באמת 1234. אם זה לא מתאים, אם זה לא באמת אלכס ולא באמת 1234 אז הוא עובר לשורה הבאה שורה שהוא כן מתאים ברגע שהוא מוצא שורה שהיא כן מתאימה הוא שולח אותה חזרה לשרת הווב שרת sql שולח את השורה הנכונה לשרת הווב בחזרה אם אנחנו עושים שורה שהיא באמת עובדת

  35. 12:03

    אז יהיה לנו admin admin אתם רואים username וpassword ואז אתם יכולים לראות פה שהוא באמת שלח לשרת הווב שורה אחת בלבד עם התוצאה אם אני עושה משהו שהוא לא קיים אלכס 1234 אתם תראו שמה sql empty results set אתם רואים הוא מחזיר empty results set אין תוצאות על המסך אם שרת וב יקבל משרת sql תשובה שאין שום שורה אין שום תוצאה אז הוא לא מכניס את היוזר פנימה רק אם יש לפחות שורה

  36. 12:44

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

  37. 12:58

    אם חוזרת תשובה ריקה משרת SQL, אני נשאר בחוץ. למה? כי זה אומר ששום שורה לא נמצאה מתאימה. מה זה שום שורה?

  38. 13:10

    זה אומר שאין שום שורה שבה השם והסיסמה הם בדיוק כפי שהזנתי אותם. אז אני צריך לדאוג ששרת SQL יחזיר לפחות שורה אחת לשרת ה-Web כתשובה לשאילתה הזאת.

  39. 13:28

    אז איך אני עובד עליו? הבעיה שלי היא כזאת שאני יכול להיכנס, אני נכנס דרך שרת Web, אני לא יכול לכתוב מה שבא לי לשרת SQL. אין לי גישה ישירה לשרת SQL כמו שאתם רואים כאן ועכשיו.

  40. 13:41

    אני יכול להזריק מידע לתוך התא הזה של אלכס, ורק לתא הזה אני יכול להזריק מידע, רק לתא הזה. למה? כי אני עובר דרך השערת ה-Web, והשערת ה-Web לוקח את ה-User Name שלי ומזריק אותו רק פה.

  41. 13:58

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

  42. 14:10

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

  43. 14:24

    השרת ווב עצמו כותב את כל השאילתה הזאת, ואת מה שאני הכנסתי לו ביוזרניים מכניס בתא הזה. השאלה זה מה לכתוב פה. אני יכול במקום אלכס, כי זה האזור שבו אני יכול להכניס נתונים.

  44. 14:35

    זה המקום היחיד שאני יכול להזריק בו נתונים, כי ככה בנוי אתר האינטרנט. אז אני עושה דבר כזה. דבר ראשון, אני רוצה להגיד לו יוזרניים שווה לרק, יוזרניים שווה לרק ייתן לי שום דבר יתאים לזה, אם אני עושה 1 שווה 1 זה תמיד true ואז התנאי הזה החלק הראשון שלו username שווה ריק הוא

לקורס המלא: קורס פריצה לאתרי אינטרנט אונליין

ההרצאה הקודמת: הסבר על Diffie–Hellman

ההרצאה הבאה: פריצה לאתר אינטרנט - SQL injection - חלק 2

הרצאות קשורות מקורסים אחרים

  • פריצה בכח לאתר אינטרנט עם Burp Intruder
  • התקפת SQL injection
  • הגנה מהתקפות SQL Injection
  • שרת מיילים חינם לאתר אינטרנט

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting