PracticU

פריצה לשרת SQL מהאינטרנט - חלק 3

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

פריצה לשרת SQL מהאינטרנט - חלק 3
ההרצאה עוסקת בחולשה מסוג Blind SQL Injection: אתר פגיע להזרקת SQL, אבל הוא לא מציג את תוצאות השאילתה לדף, ולכן התוקף לומד מהתנהגות האתר ולא מהתוכן שמוצג.
הרעיון
כשאתר מכניס קלט של המשתמש ישירות לשאילתה לבסיס הנתונים, קלט חריג יכול לשנות את משמעות השאילתה. באתר שמציג שגיאות או נתונים התוצאה נראית מיד. באתר עיוור הדף נראה רגיל, והתוקף מסיק ממנו רק אם התנאי שהזריק התקיים.
מה התוקף לומד
1. תנאי אמת ושקר: הדף נראה אחרת כשהתנאי נכון ולא נכון, ומכאן אפשר ללמוד מידע בצעדים קטנים.
2. זמן התגובה: גם כשהדף לא משתנה, השהיה של השרת מגלה אם התנאי התקיים. שיטה כזאת נקראת Time-based.
3. ריכוז מידע לשדה אחד: דף שמציג רק שורה אחת מוגבל, ולכן התוקף מנסה לאחד מידע רב לשדה אחד.
4. סיסמאות מגובבות: מידע שנשלף כולל לעיתים סיסמאות בגיבוב חלש, שאפשר לשחזר. לכן הדרך לשמור סיסמה חשובה כמו החולשה עצמה.
איך מזהים ומונעים
שאילתות עם פרמטרים (prepared statements) במקום חיבור קלט לתוך השאילתה, בדיקת קלט, הרשאות מינימליות לחשבון בסיס הנתונים, אי-הצגת שגיאות טכניות למשתמש, שמירת סיסמאות בגיבוב חזק עם salt, וניטור של זמני תגובה חריגים.
ההבנה של המנגנון עוזרת לכותבי אתרים לבנות קוד שאינו נחשף לתקיפה כזאת.
השיעור הבא בקורס: פריצה לשרת SQL מהאינטרנט - חלק 4

פרקי ההרצאה: פריצה לשרת SQL מהאינטרנט - חלק 3

  1. 00:00

    הכרת פקודות SELECT מתקדמות ב-MySQL

  2. 01:21

    סינון שורות עם WHERE

  3. 02:00

    חיבור עמודות עם CONCAT

  4. 02:59

    עמודות מורכבות וחישובים בשאילתה

  5. 04:11

    איחוד שורות לשורה אחת עם GROUP_CONCAT

  6. 05:20

    הפקודה IF ותנאים בשאילתה

  7. 07:15

    בדיקת טבלאות ב-information_schema

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

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

  1. 00:03

    שלום לכולם, זאת הולכת להיות הרצאה על SQL למתקדמים שחובה לדעת כדי להיות האקר אמיתי. אנחנו נדבר על פקודות מתקדמות ב-MySQL שמאוד מאוד חשוב שאתם תדעו אותן. אז בואו נתחיל מפקודות כמו CONCAT, ולשם כך אנחנו ניכנס לשרת MySQL דרך פאנל ניהול שנקרא PHP MyAdmin.

  2. 00:29

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

  3. 00:48

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

  4. 01:06

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

  5. 01:24

    הדאטאבייס שלי נקרא NoWasp זה הדאטאבייס ובפנים טבלה שנקראת Accounts. ואני עושה go ומקבל בעצם אותן תוצאות כי בחרתי את כולם.

  6. 01:36

    אני יכול לסנן ולהגיד לו תראה לי רק שורות שבהן username שווה ל-admin. כל מה שקורה ב-where שורה אחרי שורה תיבדק. זאת אומרת כל שורה בטבלת אקאונטס תיבדק על ידי תנאי where ואם זה אמת היא תחזור ואם זה שקר אז היא לא תחזור.

  7. 01:53

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

  8. 02:06

    CONCAT זה לחבר כמה עמודות ביחד. מה זאת אומרת? אני יכול לעשות, תבחר לי עמודה לדוגמה במקום כוכבית לרשום Username, עמודה שנקראת Client ID ועמודה הבאה, העמודה השנייה תהיה CONCAT חיבור של שתי עמודות אחרות, עמודה שנקראת Username ועמודה שנקראת Password ואני רוצה להוסיף להם עוד עמודה שנקראת נקודתיים עבור כל שורה זה יתבצע כל מה שיש

  9. 02:35

    בסלקט גם מתבצע עבור כל שורה אז יתבצע client ID עמודה שנייה תהיה עמודה חדשה פסיק is admin וגם אני יכול לעשות סתם טקסט אני יכול לעשות aaa ו bbb וגם אני יכול לעשות לדוגמה 111 אין שום בעיה לעשות סתם עמודות אין שום בעיה לעשות עמודות שהן כמו שהן באורגינל ואין שום בעיה גם לחבר לעשות עמודות מורכבות מכמה ערכים.

  10. 03:06

    אני גם אראה לכם שאפשר לעשות אפילו עמודות שהן חישוב מתמטי. ואנחנו רואים תוצאה, שיש לנו עמודה ראשונה Client ID, עמודה שנייה שתי עמודות אחרות מודבקות ביחד עם סימן נקודתיים, עמודת True, AA, BBB, 111 ו-1 פלוס 3. אתם רואים 1 פלוס 3 זה למעשה 4 הזה.

  11. 03:30

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

  12. 03:41

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

  13. 03:52

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

  14. 04:09

    אז יש לי מצב שאני בו ארצה להציג את כל הטבלה בשורה אחת בלבד. אז איך אנחנו נהפוך את כל הטבלה לשורה אחת? על ידי GroupConCut.

  15. 04:21

    GroupConCut לוקח את כל זה והופך אותם לשורה אחת. אתם רואים, נהייתה לנו שורה אחת admin, admin, admin, username, password, פסיק, הרשומה השנייה, פסיק, הרשומה השלישית.

  16. 04:34

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

  17. 04:47

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

  18. 05:04

    יש לה מגבלה ל-1024 תווים. אני יכול להתחכם ולא להשתמש בפקודת Group Concat, אלא לעשות Concat, כאילו חיבור של מחרוזות, חיבור של כל הטבלה לתוך משתנה אחד, ואז להציג את המשתנה הזה.

  19. 05:20

    כדי שנוכל לעשות את זה, אנחנו נתחיל לראות עוד איזושהי פקודה, אנחנו נצטרך לראות עוד איזושהי פקודה if. אז בואו אני אראה לכם פקודת if. לפני שאני מראה לכם if, שימו לב, אני מעיף מפה את ה-form הזה, אם אני מעיף את הפרום הזה ויעשה פה פשוט a,a,b,b,b,1 ו-1,3 הוא יעשה אותם פעם אחת.

  20. 05:46

    אתם רואים הוא עושה אותם פעם אחת ועכשיו במקום ה-b,b,b הזה נכניס כאן עמודה חדשה if אם תנאי כלשהו מתקיים אם תנאי כלשהו מתקיים תנאי שווה ל-true אם תנאי כלשהו מתקיים תיק תעשה את הפעולה הראשונה אם התנאי הוא לא מתקיים אז תעשה את הפעולה השנייה.

  21. 06:12

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

  22. 06:23

    לדוגמה הפעולה יכולה להיות Select תספור לי כמה שורות יש, Count כוכבית כמה שורות יש, בטבלה information schema.tables זה דאטאבייס שיש לו מידע על כל הטבלאות האחרות, information schema זה הדאטאבייס שיש לו מידע על כל הדאטאבייסים האחרים, זה תקן זה חייב להיות ונקודה טייבלס זה טבלה

  23. 06:49

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

  24. 07:24

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

  25. 07:52

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

  26. 08:03

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

  27. 08:20

    הנה הוא ידפיס לי פה 7a, 7a, 7a, כי הוא הפך את זה למספרים, לאסקי קודס. אם אני אעשה שידפיס לי 99 אז הוא מדפיס לי פה 99. אז איך אני יכול לנצל את זה לטובתי?

  28. 08:33

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

  29. 09:04

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

  30. 09:25

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

  31. 09:55

    לפני שאני מתחיל שימו לב פה למעלה אני רואה ששאילתה התבצעה תוך אפס שניות 0.005 שניות. אני עושה go ואתם יכולים לראות שהוא עכשיו התעכב לשלוש שניות. אתם רואים הוא התעכב שלוש שניות?

  32. 10:11

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

  33. 10:28

    זה נקרא התקפת בליינד על עיוור. בליינד SQL Injection. תסתכלו כמה זמן הוא מסתובב, מסתובב, מסתובב. ואני מקבל במסך של Web תשובה תוך 10 שניות, וזה אומר שצדקתי בשאילתה שלי.

  34. 10:48

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

  35. 11:01

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

  36. 11:15

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

  37. 11:29

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

  38. 11:40

    אני רוצה להגדיל את השדה הזה, בוחר אותו אומר לו הגודל שלו שיהיה לדוגמה 70 נהדר עכשיו הוא נהיה לי גדול בואו נראה את השאילתא אני לוקח את השאילתא הקודמת מחבר אליה שאילתא חדשה עמודה ראשונה נ"ל עמודה שנייה סופרת לי כמה טבלאות יש עם השם users לדוגמה ואם יש יותר מאפס טבלאות אם לפחות טבלה אחת קיימת אז נעשה לו sleep נניח 10 שניות ואם הטבלה לא קיימת נעשה לו sleep

  39. 12:22

    2 שניות כמה יש לי פה שתי עמודות ואני זוכר שזה לא שתי עמודות, אני כבר גיליתי שזה שבע עמודות לפני כן. הרגיליתי את זה על ידי פקודת order by או group by.

  40. 12:34

    ונעשה go, אם אנחנו עוד פעם רואים שיש טבלה שנקראת user 2 נחכה 10 שניות, אם אין טבלת user 2 נחכה 2 שניות. 1, 2, בקיצור זה היה 2 שניות.

  41. 12:48

    אם נעשה אותה שאילתה אבל נבקש ממנו לבדוק האם יש טבלה בשם אקאונטס ותסתכלו פה למעלה עוד פעם פה למעלה תכף תראו 1 2 3 4 5 6 7 8 9 10 והגענו בקיצור אנחנו ככה רואים למרות שעל המסך לא רואים שום תוצאה יפה מאוד זה נקרא בליינד אינג'קשן טוב אנחנו חוזרים לבעיה שלנו שדיברנו עליה להתגבר על הבעיה של

  42. 13:21

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

  43. 13:44

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

  44. 14:10

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

  45. 14:41

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

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

ההרצאה הקודמת: פריצה לשרת SQL מהאינטרנט - חלק 2

ההרצאה הבאה: פריצה לשרת SQL מהאינטרנט - חלק 4

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

  • יבוא נתונים לשרת SQL
  • פריצה בכוח לשרת Brute Force FTP עם Hydra
  • הורדת תמונות מהאינטרנט ב-Xcode
  • איך לפרוץ סיסמה לשרת

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

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