XSS

XSS (אנגלית: Cross Site Scripting) היא התקפה נגד גולש אינטרנט המנוצלת באמצעות פגיעות ביישומי אינטרנט ומאפשרת לתוקף להזריק סקריפט זדוני שמטרתו לרוץ בדפדפנים של משתמשי מערכת אחרים.
בעת הרצת הקוד יוכל התוקף לבצע פעולות בשמו של המשתמש בשירות על ידי ניצול מגבלות בפרוטוקול HTTP ואף לגנוב את מזהה המשתמש.

רקע

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

סוגי XSS

ניתן לחלק את פרצות ה- XSS לשלושה סוגים.

XSS Reflected

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

XSS Stored

פרצת XSS קבועה (נקראת גם Stored או Second-order) מהווה את הסוג המסוכן ביותר של פרצות XSS. הפרצה לרוב תימצא באתר המאחסן באופן תמידי קלט ממשתמש מסוים, בלי לוודא שהקלט לא מכיל קוד זדוני, ולאחר מכן מציג תוכן זה למשתמשים אחרים. דוגמה קלאסית לאתר כזה היא פורום המאפשר למשתמשים בו להציב הודעות הניתנות לצפייה על ידי שאר המשתמשים. האקר המציב הודעה המכילה קוד זדוני, יוכל למשל לגנוב את נתוני האימות של כל המשתמשים הצופים בהודעה, ולהתחזות אליהם לאחר מכן.

XSS DOM

פרצת XSS מקומית (נקראת גם DOM Based XSS) קיימת לרוב בסקריפט צד לקוח אשר משתמש בקלט כדי לייצר עמוד HTML, בלי לוודא כי קלט זה אינו מכיל קוד זדוני. לדוגמה, קוד JavaScript אשר מקבל כתובת אינטרנט כקלט, ומשתמש בה לייצור עמוד HTML, בלי לוודא שהכתובת עצמה אינה מכילה קוד, יכיל פרצת XSS מקומית.

תרחישי ניצול אפשריים

השמות בתרחישים לקוחים מתוך השמות הסטנדרטיים לתרחישי אבטחה

הגנה מפרצות XSS

הגנה אמינה מפרצות XSS דורשת קידוד של כל תגי ה- HTML המיוחדים הקיימים במידע שעלול להכיל קוד זדוני (למשל כזה המגיע מהמשתמש). לרוב פעולה זו מתבצעת לפני ההצגה עצמה של התוכן, ולשפות תכנות רבות יש ספריות המספקות שירות זה. (נקרא בהקשר הזה לרוב quoting או escaping).
לדוגמה, נניח שהמשתמש הכניס את המחרוזת הבאה:
<script>alert('xss');</script>
קידוד נכון של המחרוזת יהפוך אותה לצורה הזו:
&lt;script&gt;alert('xss');&lt;/script&gt;
הצורה המקודדת תיראה בתוך עמוד HTML בדיוק כמו המחרוזת שהמשתמש הכניס, אולם הקוד (שבמקרה זה מקפיץ חלון עם הכתובת "XSS") לא ירוץ.
הבעיה הגדולה ביותר עם הגנה מפני פרצות XSS היא שהגנה בצורה המתוארת למעלה, למעשה מונעת מהמשתמש להכניס כל דבר שאינו טקסט פשוט אל תוך עמודי HTML. אם נדרש לאפשר למשתמש הכנסת תוכן מעבר לטקסט פשוט, יש להפריד בין תגי HTML חוקיים לכאלו שאינם חוקיים, ומשימה זו היא קשה הרבה יותר, מכיוון שכל מקרה דורש טיפול לגופו.