מתקפת XSS – Cross Site Scripting

06/12/2018

אין תגובות
מה זה XSS?

הדפדפן שאנו מכירים כיום מאפשר לנו לראות תמונות, לשמוע קולות, לראות סרטונים, לטייל באתרים המעוצבים יפה ועוד. הרוב לא נתמך פעם. בתחילת הדרך הדפדפנים תמכו בטקסט בלבד, הם היו מיועדים להעברת מאמרים באוניברסיטאות וכל העודף מידע שיש כיום לא היה נחוץ אז…. עד שבא מישהו שזה כן היה נחוץ לו (טים ברנרס לי).
אני לא ארחיב כאן בנושא כיוון שזו לא מטרת הפוסט אבל בזכות הפיתוח של טים, ה HTML, הדפדפנים יכולים כעת להציג תמונות, סרטונים, קולות ועוד. ה HTML מורכב מתגיות כמו img לתמונות, p לפסקאות ועוד.

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

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

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

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

סוגי מתקפת XSS

ישנם שני סוגים של מתקפת XSS, קבוע ולא קבוע.

נתחיל בלא קבוע. אם אני אגלוש לאתר הבנק שלי דרך גוגל או ישירות מהשורת חיפוש לדוגמא אז אני אכנס לאתר הבנק והכל יהיה טוב, שום מתקפה לא בוצעה עליי. אף אחד לא יגנוב את הפרטים שלי.
הבעיה מתחילה כאשר אני נכנס לאתר הבנק מאיזה שהוא אימייל שקיבלתי, הודעת סמס או וואטסאפ וכדומה.
כאשר אני לוחץ על קישור שאני לא באמת יודע מה המקור שלו אז הקישור יכול להכיל דברים כמו לדוגמא:
http://www.thebank.com/myaccount?title=sendmeyourdetails(document.cookie)
ולרוב אני אפילו לא אחשוד כיוון שהקישור שאני אלחץ עליו יכול להיראות כך:
http://bit.ly/v76tGj
כלומר במתקפה שהיא לא קבועה, קורבן המתקפה חייב באופן פעיל ולא מודע להיכנס לאתר עם קישור זדוני אשר יגרום לאתר לגנוב לו את המידע האישי.
במתקפה מסוג זה לדווח במיידית לאתר ביחד עם הקישור הבעייתי על מנת שיבחנו אותו ויסגרו את הפרצה.

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

מניעת מתקפת XSS

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

במתקפת XSS קבועה כל המשימה לדאוג לאבטחת האתר מוטלת על מפתחי האתר.
כל קלט מהמשתמש חייב לעבור בדיקה וניקיון שהוא לא מכיל תווים שאנו לא רוצים כמו התחלה וסוף של תגית html, גרשיים, אלכסונים, מילים מסויימות כמו javascript ועוד, וגם בשרת לבצע את אותה בדיקה כי תוקף מנוסה יכול בקלות לעקוף את הדפדפן ולשלוח את הקוד הזדוני ישירות לשרת.
קלט מהמשתמש יכול להיות טפסים כמו צור קשר, שם משתמש וסיסמא לביצוע לוגין, סקר ועוד.
לגבי session למיניהם לכל שפה (ASP.NET, PHP ועוד) יש את הדרכים שלה למנוע כתיבה ל session. יש לחפש בגוגל לגבי השפה בה אתם משתמשים לפתח את האתר שלכם.

לקריאת מידע נוסף
אתר Excess XSS
https://excess-xss.com/
אתר OWASP
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *