PracticU

התקפת Stored XSS רמת אבטחה נמוכה ובינונית ב-DVWA

בלי כתוביותעם כתוביות
PracticU › קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP › התקפת Stored XSS רמת אבטחה נמוכה ובינונית ב-DVWA
מילון מושגים:
XSS - חולשה באתרים שבה תוקף מחדיר סקריפט זדוני לדף שמוצג למשתמשים אחרים ורץ בדפדפן שלהם.
עוגייה - קובץ קטן שאתר שומר בדפדפן כדי לזכור מידע על המשתמש בין בקשות, למשל מצב התחברות או העדפות.
פרוקסי - שרת מתווך שמעביר בקשות בין לקוח ליעד, ויכול לשמש להסתרה, לסינון, למטמון או לבקרת גישה.
מאפיין - תכונה שמצמידים לרכיב ומתארת אותו או את התנהגותו, למשל מאפיין של תגית HTML או שדה באובייקט.
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
סשן - פרק זמן של פעילות רציפה בין משתמש למערכת, שבו נשמר מידע על מצבו, למשל לאחר התחברות לאתר.
JavaScript - שפת תכנות שרצה בעיקר בדפדפן ומוסיפה אינטראקטיביות לדפי אינטרנט. רצה גם בצד השרת באמצעות Node.js.
חולשה - פגם או חולשה במערכת או בתוכנה שעלול לאפשר פגיעה באבטחה אם לא יטופל.

התקפת Stored XSS רמת אבטחה נמוכה ובינונית ב-DVWA
בשיעור זה נלמד מהו Stored XSS, סקריפט זדוני שנשמר בתוך בסיס הנתונים של האתר ומבצע את עצמו אצל כל מי שנכנס לעמוד הנגוע. נראה איך עוקפים את ההגבלות בממשק, איך גונבים קוקיז אל שרת זדוני בקאלי לינוקס, איך נראית ההגנה של קידוד HTML ברמה הגבוהה ביותר, ואיך עוקפים את ההגנה החלקית של הרמה הבינונית בעזרת פרוקסי Burp והכלי Repeater.
נושאי הסיכום המוצגים בשיעור:
1. מהו Stored XSS: סקריפט זדוני שנשמר בבסיס הנתונים של האתר, הוא פרסיסטנטי וקבוע, וכל מי שנכנס לעמוד שאליו הוא שולח מבצע אותו בדפדפן שלו. כך התוקף פורץ בפועל לדפדפנים של כל הלקוחות של האתר.
2. פתיחת המעבדה ברמה נמוכה: מעבירים את רמת האבטחה של DVWA ל Low ופותחים את עמוד ספר האורחים, עמוד שבו משאירים תגובות כמו באתרים אמיתיים, עם שדה שם ושדה הודעה, כמו תגובה מתחת לסרט ביוטיוב או טופס יצירת קשר.
3. עקיפת הגבלת התווים בממשק: שדה השם מוגבל לעשרה תווים בעזרת המאפיין maxlength של רכיב ה input, הגבלה שקיימת בצד הלקוח בלבד. בעזרת Inspect Element מוחקים את המאפיין ואז אפשר לכתוב בשדה כמה תווים שרוצים, וגם הגבלה של חמישים תווים שמופיעה בהמשך מוסרת באותה דרך.
4. זיהוי שני השדות הפגיעים: כותבים בשדה השם ובשדה ההודעה טקסט מזהה ולצדו סקריפט שמציג הודעת alert, שומרים בעזרת Sign Guestbook, ושני השדות מחזירים את הסקריפט ומבצעים אותו. ב View Page Source רואים שהסקריפט חזר מהשרת בשני השדות בלי שום קידוד, כלומר שניהם לא מוגנים.
5. משמעות האחסון בבסיס הנתונים: ההודעות נשמרות בבסיס הנתונים וחוזרות לכל מי שנכנס לעמוד, גם אחרי ניווט הלוך ושוב. התוקף מציב את הסקריפט פעם אחת והוא פוגע בכל הלקוחות של האתר, למשל בגניבת קוקיז או בעמוד התחברות מזויף שדומה לעמוד של פייסבוק או של בנק, שאליו הקורבן מזין בעצמו את הנתונים שלו.
6. השוואה מול Reflected XSS: ב reflected הסקריפט יושב בתוך הלינק ורק מי שלחץ עליו נפגע, וב stored הוא יושב בבסיס הנתונים וכל מי שצופה בעמוד נפגע. מחפשים לכן דפי הרשמה ודפי תגובות, מקומות שבהם המידע נשמר ומוצג לאחרים, והגרסה המאוחסנת היא החזקה בהרבה משתיהן.
7. הכנת שרת קליטה זדוני: בקאלי לינוקס מתחברים כ root ומרימים שרת web שמאזין וממתין לחיבורים. הסקריפט השתול מורה לדפדפן של הקורבן לגלוש לכתובת של השרת הזה ולצרף לגלישה את document.cookie, הקוקיז של האתר הנוכחי, שכוללים בין השאר את מזהה הסשן. את הקוקיז אפשר לראות גם בעצמנו בעזרת F12 באזור ה Storage של הדפדפן.
8. הקורבן התמים והגניבה בפועל: מבקש רגיל נכנס לעמוד, לא עושה שום פעולה חשודה, ומיד עם הכניסה הדפדפן עובר באופן אוטומטי לאתר הזדוני ומצרף את הקוקיז. התוקף מקבל את הקוקיז ויכול להיכנס לאתר בשמו של הקורבן. אתרים מתוחכמים מגונים מפני כך למשל בקשירת הקוקי לכתובת IP מסוימת, אך אתרים רבים מסתמכים על הקוקיז בלבד.
9. ההגנה ברמה הגבוהה ביותר: ברמה Impossible הסקריפט אינו מתבצע. ב View Page Source רואים שהסימנים האסורים עברו HTML encoding, ולכן מנוע ה JavaScript מתעלם מהם ומנוע התצוגה של ה HTML מציג אותם כטקסט רגיל. גם המתכנת המקורי עצמו מריץ סקריפטים משלו מתוך קובץ חיצוני, אך כל קלט של משתמש מגיע מקודד מהשרת ואז הדפדפן אינו מבצע אותו.
10. החולשה ברמה הבינונית: DVWA מאפשר לצפות בקוד של השרת, ושם נחשף שבשדה ההודעה כל התווים האסורים מקודדים, אך בשדה השם רק מוסרת המילה script בעזרת החלפת טקסט, בלי קידוד כלל. המתכנת חשב על פריצה דרך ההודעה וטיפל בה, אך לא חשב שמישהו יפרוץ דרך השם.
11. מעבר לעבודה דרך פרוקסי: במקום להתאבק עם הממשק הגרפי המגביל, מפעילים פרוקסי ב Burp שמתעד את התעבורה בלי לעצור אותה, מכוונים את הדפדפן לעבור דרכו, ומעכשיו עובדים ישירות על הבקשות שנשלחות לשרת במקום על הממשק.
12. עקיפת מחיקת המילה: ההגנה מוחקת את המופע הראשון של המילה script ואינה חוזרת על כך, לכן כותבים בשדה השם מילה שבתוכה מוטמעת המילה עצמה. אחרי המחיקה נשארת תגית סקריפט תקינה, ה alert מוצג, וב View Page Source נראה שבשדה השם הסקריפט חזר שלם ובשדה ההודעה נשאר ממנו טקסט רגיל בלבד. כל מי שייכנס לעמוד יחטוף את הסקריפט.
13. עבודה נוחה בכלי Repeater: את בקשת שמירת התגובה שולחים לכלי ה Repeater של Burp, שמאפשר לערוך את הבקשה, לשלוח אותה ולקבל את התשובה בלי לעבור דרך הממשק הגרפי. ה Inspector מזהה את הפרמטרים שבגוף הבקשה, ה body parameters, מפרק את הקידוד לבד, ואז עורכים את ערך השם, מאשרים את השינוי ושולחים. בתגובה רואים שהסקריפט חזר תקין בתוך השם.
14. אימות מצד הקורבנות: נכנסים לעמוד כלקוח תמים ומקבלים מיד הודעת alert עם הקוקיז. מוסיפים לסקריפט גם את המעבר לאתר הזדוני עם הקוקיז מוצמד, עורכים ב Repeater, שולחים, ובתגובה הסקריפט חוזר שלם. כל מי שנכנס לעמוד עובר לאתר הזדוני ומצרף את הקוקיז שלו, והשרת הזדוני רושם אותם ביומן שלו.
15. ניקוי והמשך: גם בקשת ניקוי ספר האורחים נשמרת ב Repeater, וכך מנקים את בסיס הנתונים בלי הממשק הגרפי ובלי לחטוף את הסקריפט של עצמנו. בשיעור הבא נעבור לרמת האבטחה הגבוהה, שמוגנת בצורה משמעותית יותר, ונלמד שם טכניקות חדשות.
בשיעור זה נחשף מנגנון ה Stored XSS שנשמר בבסיס הנתונים ופוגע בכל מי שנכנס לעמוד, הגבלות הממשק נעקפו בעזרת Inspect Element ופרוקסי, הרמה הבינונית נעקפה בטריק המילה המפוצלת, הקוקיז של הקורבנות הגיעו אל שרת זדוני בעזרת Repeater, ונראתה ההגנה של קידוד ה HTML ברמה הגבוהה ביותר. בשיעור הבא נעסוק ברמת האבטחה הגבוהה.
SR12548HE

פרקי ההרצאה: התקפת Stored XSS רמת אבטחה נמוכה ובינונית ב-DVWA

  1. 00:00

    XSS הקבוע במסד הנתונים

  2. 00:42

    שדות התגובות באתר

  3. 01:37

    הזרקת סקריפט בשני השדות

  4. 02:12

    כל המבקרים מריצים את הסקריפט

  5. 03:43

    ההבדל בין Stored ל-Reflected

  6. 04:53

    הכנת שרת לאיסוף Cookies

  7. 06:49

    קבלת ה-Cookies מהקורבן

  8. 07:58

    הגנה עם קידוד HTML

תמלול ההרצאה: התקפת Stored XSS רמת אבטחה נמוכה ובינונית ב-DVWA

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

  1. 00:02

    שלום לכולם, בהרצאה הזו נדבר על XSS Stored Stored זה אומר שהוא מאוחסן בתוך דאטאבייס הוא פרסיסטנט, הוא קבוע בתוך הדאטאבייס של האתר וכל מי שנכנס חוטף את ה-XSS שלנו חוטף את הסקריפט הזדוני שנכתוב בואו נתחיל מזה שנעביר את ה-Security Level לרמה נמוכה ל-Low וב-Stored יש לנו מקום כאן אני רק רוצה לבדוק פה שזה באמת Low, זה באמת

  2. 00:32

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

  3. 00:47

    אז אני במקום ליצור קשר כותב aaa alert. אוי, אין לי מקום פה לכתוב את הזה, כי הגבילו לי את התווים, אתם רואים מה זה? אין לי מספיק תווים, אני לוחץ כפתור ימני, אקספקט אלמנט לראות את הרכיב הגרפי הזה ואני רואה כאן ברכיב הגרפי שיש לו שדה שנקרא max length שווה 10 זאת אומרת שהם מאשרים לי 10 תווים ברכיב הזה של input text name טוב זה לא ממש מקובל על 10 תווים אני מוחק את זה יופי

  4. 01:19

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

  5. 01:35

    זה בתוך המסג', אני רוצה לראות איפה יש להם חור אבטחה. כאן אני כותב BBB וAlert 2. למה אני כותב AA ו-BBB? כדי שאני אדע למצוא את זה בקלות, כשהתשובה תחזור אליי מהשרד, שאני אדע למצוא את זה בקלות, איפה זה חזר, בדיוק באיזה מיקום זה חזר, ואנחנו עושים Sign Guestbook.

  6. 01:56

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

  7. 02:26

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

  8. 02:45

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

  9. 03:06

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

  10. 03:33

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

  11. 03:42

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

  12. 03:50

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

  13. 04:01

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

  14. 04:23

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

  15. 04:43

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

  16. 04:51

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

  17. 05:15

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

  18. 05:24

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

  19. 05:46

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

  20. 06:07

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

  21. 06:21

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

  22. 06:42

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

  23. 07:13

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

  24. 07:32

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

  25. 07:44

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

  26. 07:58

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

  27. 08:22

    את הסקריפט ויש לנו כפתור לנקות את הדאטאבייס דרך אגב למה הסקריפט הזה לא התבצע עכשיו מה השתנה בוא נעשה view page source ונראה פה ב-ccc שלפני מילת סקריפט הסוגריים קודדו, זה נקרא לקודד.

  28. 08:39

    הוא עשה html encoding וקידד את הסימן הזה ולכן javascript מתעלם מזה אבל מנוע תצוגה של html מציג לי את זה בצורה יפה. אתם רואים? זה נראה כאילו הסקריפט הזה רגיל אבל למה הוא לא מתבצע בפועל?

  29. 08:58

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

  30. 09:09

    אז זאת הרמה של ה-impossible שהם מקודדים לי את הכל, ואז אני לא יכול להריץ את הסקריפט,

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

ההרצאה הקודמת: עדכון של DVWA בתוך Metasploitable2

ההרצאה הבאה: התקפת Stored XSS רמת אבטחה גבוהה באתר ב-DVWA

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

  • אבטחה עם VM Templates
  • הגנה מהתקפות XSS
  • הכל על Stored Procedure
  • קריאה ל-Stored Procedure

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

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