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 מקומי 
 מלורי שולח כתובת של אתר אינטרנט (שהוא שולט בתוכן שלו) לאליס.
 אליס נכנסת לאתר
 האתר מכיל קוד JavaScript הפונה לדף HTML פגיע על המחשב של אליס
 ניצול החולשה באתר הפגיע גורם לקוד הזדוני של מלורי לרוץ בתוכו בהרשאות של עמוד מקומי.
 הקוד של מלורי יכול כעת לבצע כל פעולה בהרשאות המשתמש של אליס על המחשב שלה.

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

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

דוגמאות לניצול של פרצות XSS
ניתן למצוא באינטרנט מאות דוגמאות של ניצול פרצות XSS. להלן מספר דוגמאות בולטות.
 באוקטובר 2001 נמצאה פרצת XSS קבועה בשירות הדואר האלקטרוני Hotmail. פרצה זו אפשרה להאקר לשלוח הודעת דואר אלקטרוני המכילה קוד זדוני לכתובת בשירות Hotmail ולגנוב את נתוני האימות של המשתמש. הפרצה עצמה הייתה במנגנון סינון הסקריפטים של Hotmail שמטרתו למנוע הגעה של הודעות דואר אלקטרוני המכילות קוד. פרצה זו נסגרה במהירות, אולם לאחר מכן נמצאו עוד פרצות רבות במנגנוני סינון הקוד של שירותי הדואר האלקטרוני השונים.
 בדצמבר 2005 פרסמו על ידי יאיר עמית שתי פרצות XSS זמניות בשירות Google. הפרצות אפשרו לתוקף להתחזות לשירות לגיטימי של Google ובכך לסייע לו בהתקפת פישינג. פרסום זה הציג התמודדות חדשנית עם שיטות המניעה ל- XSS שהיו מקובלות עד אז, בעזרת שימוש בקידוד UTF-7.
 ב-16 ביוני 2006, חברת Netcraft פרסמה כי קיימת פרצה בשירות PayPal המאפשרת התחזות לאתר השירות וגנבה של פרטי כרטיסי אשראי של לקוחות. החברה טענה כי הפרצה נוצלה על ידי האקרים לגנבת פרטי האשראי של לקוחות תמימים. זמן מועט לאחר הפרסום דיווחה חברת Paypal כי "שינויים בחלקים מהקוד באתר Paypal" חסמו את הפרצה. לא קיימים פרטים מדויקים על אופי הפרצה במקרה זה, אולם באופן כללי ניתן לבצע התקפות מסוג זה כאשר קיימת פרצת XSS זמנית או קבועה.
 בחודש אוגוסט 2006, נוצלו באופן הומוריסטי שתי פרצות XSS זמניות. דיווח חדשות מזויף טען כי נשיא ארצות הברית, ג'ורג' בוש, מינה ילד בן 9 ליושב ראש של המחלקה לביטחון מידע. הטענה גובתה בקישורים לאתרים cbsnews.com ו-www.bbc.co.uk. שני האתרים היו פגיעים לשתי פרצות XSS שונות, לכן ניתן היה לשתול בהם את המאמרים המזויפים.

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

לדוגמה, נניח שהמשתמש הכניס את המחרוזת הבאה:
<script>alert('xss');</script>
קידוד נכון של המחרוזת יהפוך אותה לצורה הזו:

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

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

קטגוריות דומות של פרצות אבטחה
 Cross Zone Scripting - פרצות המאפשרות מעבר בין אזורי אבטחה בדפדפן. פרצות XSS מקומיות הן לפעמים גם פרצות מסוג Cross Zone Scripting.
 HTTP header injection - פרצות המתרחשות כאשר כותרות ה-HTTP נוצרות מתוכן המסופק על ידי המשתמש. פרצות מסוג זה לעיתים מנוצלות על מנת ליצור תנאים מתאימים ל- XSS
CSRF - התקפה נגד גולש אינטרנט המאלצת את דפדפן האינטרנט של הגולש לבצע פעולות לא רצוניות ביישומי אינטרנט בשמו של המשתמש בשירות באמצעות ניצול מגבלות בפרוטוקול HTTP.
 Cross Application Scripting - פרצה הנובעת מהעובדה שדפדפנים מסוימים מפעילים תוכנות אחרות על המחשב של המשתמש כאשר נותנים כתובות או קישורים מסוימות. כך למשל הכתובת "//:mailto" בדפדפנים מסוימים תפתח את תוכנת המייל המותקנת במחשב, דבר המאפשר להריץ קוד על המחשב עצמו.

ראו גם
 CSRF
 הזרקת SQL
 File Inclusion
 Directory Traversal

קישורים חיצוניים 

 הסבר על XSS, באתר Apache Foundation 
 הסבר על XSS DOM, אתר Webappsec.org 
 שאלות ותשובות בנושא XSS, באתר Cgisecurity.com 
 כיצד להימנע מפגיעויות XSS, אתר Shiflett.org 

אבטחת מידע

הערות שוליים 

אבטחת מחשבים