X11 Solution
בספר שלי "סייבר ובדיקות חוסן ליישומי אינטרנט" הסברתי את הנושא XSS על בוריו ואף נתתי לכם 11 אתגרים לבצע, לכל אחד מהאתגרים הללו ישנו פתרון בספר פרט לאתגר 11.
כפי שהבטחתי בספר ולאחר שקיבלתי פניות מרובות ב-Facebook ובדף שלנו לינק לדף, החלטתי להקליט סרטון שמציג את הפתרון.
את האתגר תוכלו למצוא במערכת האתגרים שנכתבה במיוחד עבור הספר ב-github שלי:
כמו רוב האתגרים במערכת גם אתגר זה מבוסס על ממצא אמיתי, והפעם מדובר ב-XSS שמצאנו בפורום של חברת DJI שהיה בעצם החלק הראשון בממצא שלנו – השתלטות על כל מערכות ה-Web של DJI ואף שליטה ברחפן במערכת DJI FlightHub.
סרטון שמציג את פתרון האתגר:
האתגר נראה כך:
אם נכניס את הפרמטר message ואת התוכן aaa ב-url:
stage11.php?message=aaa
נקבל את השגיאה הבאה:
שימו לב שהפונקציה updateDownImageList לא מוגדרת בכוונה, כנראה הגענו לדף כלשהו שנטען ב-iframe ול-parent שלו יש את הפונקציה הזאת ב-scope.
כדי לבצע XSS עלינו תחילה לנסות לצאת מתוך הגרשיים, כך שאם נזין '\ הפונקציה addcslashes תוסיף לנו \ לגרש שלנו ובגלל שהוספנו \ בעצמנו הוא יהפוך לטקסט מה שיראה כך:
כעת עלינו למצוא דרך לטפל בצורה תקינה בתווים ;(' שנשארו ב-JavaScript על פי Mozilla Developers:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar
קיימים 2 סוגי הערות בשפת JavaScript:
- //
- /**/
אז איך בכל זאת ניתן לנצל את ה-XSS הזה? התשובה היא באמצעות הערה שלישית שלא הרבה משתמשים בה או בכלל יודעים שיש אפשרות כזאת ב-JavaScript מכיוון שאינה מופיעה באתרי פיתוח ב-JavaScript.
ב-JavaScript קיימת הערה נוספת והיא בעצם שימוש בחלק של הפתיחה של ההערה של HTML מה שנראה כך --!> סוג זה של הערה זהה ל-// מה שיראה כך:
הערה זו שונה מהערת HTML מכיוון שאין לה את החלק השני שסוגר אותה "-->" בדומה ל- "/* */" ולכן היא הערה של שורה בודדת כגון הערה "//".
נשתמש בהערה בצורה הבאה:
השגיאה שאנו רואים בדפדפן כעת היא:
לכן עלינו להגדיר את הפונקציה הזאת בעצמנו בצורה הבאה:
\'); function updateDownImageList (data) { } <!--
אם נכניס את הקוד הזה בדפדפן נראה שאין לנו שגיאות והכל עובד בצורה תקינה, כעת נוסיף את הקוד הזדוני שלנו לתוך הפונקציה (updateDownImageList(data כדי שיגנוב את העוגייה בשבילנו, מה שיראה כך:
\'); function updateDownImageList (data) { alert(document.cookie); } <!--
ואם נכניס את זה לדפדפן נקבל את כל העוגיות:
נקודה נוספת שיש לציין היא שה-XSS שמצאנו לא נחסם בדפדפנים על ידי XSS Auditor מכיוון שהוא נזרק ישירות ל-JavaScript ואנו לא צריכים לסגור תגים, כך של ל-XSS Auditor מאוד קשה לאתר אותנו.