
הטקסט המלא של הדקות הראשונות בהרצאה «פריצה לאתר אינטרנט - SQL injection - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב חברים אנחנו מתחילים סדרת הרצאות על sql injection שזאת התקפה מאוד מאוד מאוד חזקה אחת החזקות ביותר שקיימות וזאת התקפה מאוד מאוד מאוד טובה ומאוד חזקה ומאוד יעילה היא עובדת באמת אפילו עד עצם יום הזה הנה אני אתן לכם דוגמה אתר אינטרנט אמיתי שפתוח באינטרנט האתר הזה נמצא בהונג קונג אתר אמיתי חשוף להתקפה הזאת שזה אתר אמיתי מכללה אמיתית מצאתי שהיא חשופה להתקפה הזאת שלא תחשבו שזה
משהו שהוא תיאורטי בלבד ואנחנו נראה איך אפשר לנצל את ההתקפה הזאת כדי לפרוץ באמת לאתרים ואנחנו רוצים בעצם דרך sql injection להיכנס במקום username וpassword להכניס פה נניח אנחנו לא מכירים אנחנו לא יודעים מה לרשום אנחנו לא יודעים שם וסיסמה ואנחנו רוצים לתקוף ולהיכנס
כדי לדעת איך להתחכם עם הsql איך לעבוד עליו למרות שאנחנו לא יודעים שום שם וסיסמה כדי שהsql הזה יכניס אותנו בפנים צריך לעשות כמה טריקים וזה בדיוק מה שאנחנו הולכים ללמוד אז בואו נראה איך אנחנו עושים את זה אז נניח אני כותב פה שם אלכס ופסוורד 1234 אני לא יודע ואני לא מצליח להיכנס אין שם וסיסמה אלכס ואין סיסמה 1234 השאלה זה מה אני יכול לרשום פה במקום אלכס
כדי להתחכם עם הsql ולעבוד עליו אז כדי שאנחנו נבין איך זה עובד דבר ראשון אנחנו צריכים לקלף את כל הגרפיקה הזאת ולראות מה קורה מאחורי הקלעים מה נשלח לשרת כדי ללמוד מה קורה מאחורי הקלעים אנחנו נשים שרת פרוקסי תסתכלו אני נכנס פה לאלט לוחץ אלט אדיט פרפרנסס
אלט אדיט פרפרנסס והולך להוסיף שרת פרוקסי שיתפוס את הפאקטים שיוצאים מדפדפן אז אני אוכל לשנות אותם ולשחרר אותם החוצה זאת אומרת כאילו אני עוקף את כל ההגנות בצד הלקוח אני תופס את הפאקט אחרי שהוא עובר את הדפדפן ולפני שהוא מגיע לאתר כאילו הכל עובר דרך פרוקסי, הכל עובר דרכי אז אני נכנס פה ל-advanced network
settings וקובע שאני רוצה פרוקסי אני הולך להיות פרוקסי של עצמי, שרת פרוקסי של עצמי ואני מוחק פה no proxy for כי אני בעצמי רוצה לעבור דרך עצמי אני מוחק את זה, מכניס פרוקסי ב-http ונשים port 8080, יש?
אז 127.0.0.1 זה שרת פרוקסי 80.80 ו-NoProxy4 אני מנקה ועושה אוקיי. יופי, עכשיו יש לי שרת פרוקסי מוגדר ואני צריך להפעיל את הפרוקסי אחרת שום דבר לא יעבוד לי.
זאת אומרת שאם אני אעשה עכשיו לוגין הוא כותב לי TheProxyServerIsRefusing אין לי שרת פרוקסי.
בואו נפעיל שרת פרוקסי, יש הרבה תוכנות שעושות את זה. אנחנו נשתמש בתוכנה שנקראת BopSuite שהיא מובנית בתוך קאלי.
נפעיל את ביורפ נעשה נקסט נקסט נקסט ועכשיו בלשונית של פרוקסי אינטרספט איז און זה אומר שהוא יעצור לי את הפאקט באופצ'נס שלו אני רואה שהפרוקסי אתם רואים פרוקסי באופצ'נס עובד בפורט 8080 שזה הדיפולט שלו הבקשות של הקליינט הוא תופס והתשובות של השרת הוא לא תופס אתם רואים סרבר ריספונסס הוא לא תופס אני שם לו v לתפוס רק כדי להראות לכם איך
נראות התשובות של השרת בואו נראה ניכנס שוב לאותו הדף עושים enter והפעם הוא מסתובב והוא מחכה לתשובה מהשרת אבל השרת תפס את הבקשה כאן הנה זאת הבקשה לקחת איזשהו עמוד לוגין אוקיי אני עושה לו forward והנה התשובה של השרת בואו נראה עוד פעם אני עובר חזרה לפייר פוקס עושה פה אלקס 1234 לוגין עובר לשרת פרוקסי זה לא קשור זה לא יודע מה הוא שלח פה
הנה הבקשה שלי שימו לב הבקשה אומרת שיש פה אלכס ופסוורד מה אנחנו לומדים קודם כל אנחנו חייבים להכיר איך נראית הבקשה אז שימו לב יש פה שם של הפרמטר ויש את הערך שלו שזה אלכס למעשה מה שאנחנו מכניסים בתוך טופס עובר בצורה כזאת שם של פרמטר שווה הערך שלו ומה קורה השרת שרת וב שזה יכול להיות שרת וב זה יכול להיות אפאצ'י בלינוקס או איי אס במיקרוסופט
שרת איי אס במיקרוסופט או אפאצ'י בלינוקס לוקח את הבקשה הזאת ומקלף מתוכה את הערכים וניגש לשרת sql שואל את הsql את המסד נתונים תגיד לי זה באמת הנתונים הנכונים ואם זה נכון הsql מחזיר לו תשובה והוא מחזיר לי את התשובה אני בעצם מעביר בקשה לשרת עם הערכים האלו עכשיו שימו
הערכים האלו יכולים להיות כאן וזה נקראת פוסט מה זה פוסט זה אומר שזה בתוך הגוף למעשה יש לנו פה שני חלקים יש לנו את החלק הזה שהחלק הזה נקרא הדרים וזה כל מיני כותרות ויש את החלק הזה שנקרא הגוף הגוף הזה אמור להיות גדול כששרת יחזיר לי תשובה זה הולך להיות גוף גדול אם יש גוף בתוך הבקשה הבקשה נקראת פוסט אם
אין גוף אם הבקשה הייתה רק הדרים זה נקרא גט אם יש גט אז כל כל הפרמטרים האלו היו כתובים פה בתוך כתובת url בתוך הבקשה בתוך הurl היו כתובים כל הפרמטרים וזה היה נקרא get אז יש לנו בקשת פוסט עם הפרמטרים בגוף שלא רואים אותם בurl זה הurl יופי אני עושה forward ומקבל תשובה מהשר"ט שימו לב איזה תשובה מהשר"ט אני מקבל זה התשובות
מהשר"ט שנייה הנה זאת התשובה כי היו שם כמה תשובות http://11200 זה הסטטוס אוקיי הדף תקין זה אומר שהדף נמצא אם דף לא נמצא הייתי מקבל לדוגמה 404 אני מקבל את כל ההדרים את כל ההדרים לדוגמה אם היה קוקי היינו רואים פה את הקוקים ואת הבאדי
בגלל שהבאדי של התשובה הוא מאוד גדול בניגוד לבקשה האינטרנט הוא אסימטרי בגלל זה האינטרנט הוא אסימטרי כי הבקשה עצמה היא מאוד קטנה זה רק הפרמטרים שהזנו והתשובה היא מאוד גדולה כי זה הגוף של התשובה בגלל זה אנחנו רואים שאפלואוד מהירות אפלואוד באינטרנט הביתי היא הרבה יותר נמוכה ממהירות דאונלורד.
לדוגמה, מהירות ההורדה זה 100 מגה ביט, מהירות ההעלאה זה 3, 3 לעומת 100. בדיוק בגלל זה. עכשיו השאלה, אנחנו חוזרים לשאלה שלנו המקורית, איך אנחנו מתחכמים פה, איך אנחנו פה מתחכמים כדי שבהיסטוריה, כדי לרשום פה משהו, למרות שאנחנו לא יודעים
שם וסיסמה, לגרום ל-SQL להבין את השם והסיסמה. אז אנחנו צריכים לשחק פה עם הפרמטרים האלו ולעבוד עליהם. איך אנחנו נעשה את זה?
נלחץ כפתור ימני ו-send to repeater. רפיטר זה כלי שישלח בקשות, יקבל אותם חזרה. ישלח, יקבל אותם חזרה, והנה אנחנו עשינו את זה, ופה רפיטר הופיע למעלה.
עכשיו אנחנו יכולים לשלוח בקשה ולקבל תשובה. לשלוח בקשה, לקבל תשובה. בואו נעשה go ו-render. ואנחנו רואים פה not logged in. notlogged in, אולי זה לא נראה יפה, זה אומר ששלחנו את הבקשה הזאת, קיבלנו את התשובה הזאת, החלק הזה נקרא חדרים, הנה אנחנו יכולים לראות אותם,
מבודדים, אתם רואים, זה אותם חדרים מבודדים, זה אותו מידע באקסה שזה לא מעניין, html מבודד, זה אומר שמתוך הבקשה html, ואם את html הזה אנחנו רוצים להראות בדפדפן, זה נקרא רנדר, וכך הוא נראה בדפדפן, לדוגמה כחול וגודל וכאלו דברים.
אז זה מה שהשרת שלח לי בחזרה תכלס, שהחלק הזה נקרא הדרים והחלק הזה נקרא body והוא בשפת html וברנדר זה הכי קל לראות טוב השאלה זה מה לרשום פה וזאת השאלה הכי מעניינת כדי לדעת מה לרשום פה אנחנו צריכים לדמיין לדמיין מה המתכנת עשה אם אנחנו נדמיין נכון מה המתכנת עשה נבין איך אנחנו מתחכמים איתו אז בוא נעשה דמיון מודרך וננסה לדמיין מה המתכנת עשה קודם כל אני
רוצה לעצור פה האינטרספט איזוף בסדר אז אני כדי לדמיין את זה יותר נוח, אני אכנס ל-MySQL כדי שיהיה לנו יותר נוח לדמיין.
PHP MyAdmin, שם וסיסמה זה מוטילידיי. זה יכול להיות כל בסיס נתונים, אני סתם נותן לכם דוגמא איך אני מדמיין דברים.
יש לנו בתוך כלי ניהול של דאטאבייס, של שרת MySQL, הרבה דאטאבייסים, הרבה מסדי נתונים שנקראים סכמה. אנחנו נבחר לדוגמא את הדאטאבייס הזה, ובדאטאבייס הזה נבחר טבלת אקאונטס, זה הטבלאות.
וזה הטבלה שאנחנו עכשיו מדמיינים מה עשה המתכנת. אם אני הייתי מתכנת, מה הייתי עושה אם הייתי מקבל את הפרמטר הזה ואת הפרמטר הזה כדי להחזיר לאתר אינטרנט תשובה אוקיי או לא אוקיי.
ואז אתר האינטרנט, האפאצ'י OIS, מוסיפים לכל התשובה שלי את הגרפיקה של HTML. כל הנתונים יושבים בשרת SQL שאליו יכול לגשת רק שרת Web. אז שרת ווב, הקליינט ניגש לשרת ווב, ושרת ווב ניגש ל-SQL, לוקח את הנתונים, מוסיף על הנתונים הגולמיים את הגרפיקה שמתוכנתים אצלו בשרת ה-Web.
שרת ווב, הדפים ששם, הקוד PHP או קוד .NET, זה בעצם הגרפיקה של האתר, אז הוא לוקח את הנתונים של SQL פלוס הגרפיקה שנמצאת אצלו מקומית בשרת ה-Web, עושה מזה סלט אחד גדול, ושולח לי את התמונה המוכנה כולל הנתונים וכולל הגרפיקה.
מה הוא עושה כשמגיע אליו יוזרנם ופספורט? מה הוא עושה? שרת ה-Web. אז שרת ה-Web, אם אני הייתי המתכנת שלו, אז הייתי כותב בשפת SQL דבר כזה Select כוכבית.
כוכבית זה אומר כל העמודות שיש בטבלה, ובטבלה אתם יכולים לראות שיש פה 1, 2, 3, 4, 5, 6, 7 עמודות. זה השמות של העמודות.
אני אומר לו, תקשיב, תבחר לי את כל העמודות מטבלה שנקראת אקאונטס, עבור כל שורה, שימו לב, עבור כל שורה בטבלה אני בודק האם Username שווה ל-Alex and Password שווה ל-1234.
זאת אומרת ש-SQL עובר על כל טבלת אקאונטס, על כל טבלת אקאונטס, ועבור כל שורה הוא בודק האם התנאי הזה מתקיים. האם בשורה מספר 2 שהוא נמצא כרגע, האם עמודה של Username זה באמת Alex?
וגם הסיסמה היא באמת 1234. אם זה לא מתאים, אם זה לא באמת אלכס ולא באמת 1234 אז הוא עובר לשורה הבאה שורה שהוא כן מתאים ברגע שהוא מוצא שורה שהיא כן מתאימה הוא שולח אותה חזרה לשרת הווב שרת sql שולח את השורה הנכונה לשרת הווב בחזרה אם אנחנו עושים שורה שהיא באמת עובדת
אז יהיה לנו admin admin אתם רואים username וpassword ואז אתם יכולים לראות פה שהוא באמת שלח לשרת הווב שורה אחת בלבד עם התוצאה אם אני עושה משהו שהוא לא קיים אלכס 1234 אתם תראו שמה sql empty results set אתם רואים הוא מחזיר empty results set אין תוצאות על המסך אם שרת וב יקבל משרת sql תשובה שאין שום שורה אין שום תוצאה אז הוא לא מכניס את היוזר פנימה רק אם יש לפחות שורה
אחת שהגיעה לשרת הווב הוא יכניס אותי כי זה אומר שנמצאה שורה שמתאימה לשם והסיסמה שנתתי. אז רק אם חוזרת לפחות שורה אחת, אני נכנס פנימה.
אם חוזרת תשובה ריקה משרת SQL, אני נשאר בחוץ. למה? כי זה אומר ששום שורה לא נמצאה מתאימה. מה זה שום שורה?
זה אומר שאין שום שורה שבה השם והסיסמה הם בדיוק כפי שהזנתי אותם. אז אני צריך לדאוג ששרת SQL יחזיר לפחות שורה אחת לשרת ה-Web כתשובה לשאילתה הזאת.
אז איך אני עובד עליו? הבעיה שלי היא כזאת שאני יכול להיכנס, אני נכנס דרך שרת Web, אני לא יכול לכתוב מה שבא לי לשרת SQL. אין לי גישה ישירה לשרת SQL כמו שאתם רואים כאן ועכשיו.
אני יכול להזריק מידע לתוך התא הזה של אלכס, ורק לתא הזה אני יכול להזריק מידע, רק לתא הזה. למה? כי אני עובר דרך השערת ה-Web, והשערת ה-Web לוקח את ה-User Name שלי ומזריק אותו רק פה.
זה המיקום היחיד שאני יכול להזריק מידע. אני יכול גם להזריק לחלק של הפסוורד, אבל בואו נקשה על עצמנו, כאילו אנחנו יכולים להזריק רק במקום מסוים את המידע.
ועכשיו השאלה המעניינת, מה להזריק כאן, בתוך התא הזה, ואני לא יכול לגעת לא בצד שמאל שלו ולא בצד ימין שלו, כי כל שאר החלקים, כל מה שמשמאל וכל מה שמימין, מי שכותב את זה זה השרת ווב עצמו כותב את זה.
השרת ווב עצמו כותב את כל השאילתה הזאת, ואת מה שאני הכנסתי לו ביוזרניים מכניס בתא הזה. השאלה זה מה לכתוב פה. אני יכול במקום אלכס, כי זה האזור שבו אני יכול להכניס נתונים.
זה המקום היחיד שאני יכול להזריק בו נתונים, כי ככה בנוי אתר האינטרנט. אז אני עושה דבר כזה. דבר ראשון, אני רוצה להגיד לו יוזרניים שווה לרק, יוזרניים שווה לרק ייתן לי שום דבר יתאים לזה, אם אני עושה 1 שווה 1 זה תמיד true ואז התנאי הזה החלק הראשון שלו username שווה ריק הוא