XSS

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

XSS (ראשי תיבות של: Cross-site scripting) היא קטגוריה של פרצות אבטחה הנמצאות לרוב באתרי אינטרנט המאפשרים הכנסת תוכן על ידי משתמשים. ניצול של פרצות אלו מאפשר הזרקת קוד זדוני אל אתר אינטרנט על ידי משתמש. כאשר משתמש תמים נכנס לאתר האינטרנט הפרוץ, מחשבו של המשתמש התמים מתייחס לקוד הזדוני כאל קוד לגיטימי של האתר הפרוץ, ומריץ את הקוד הזה. מכיוון שהקוד הזדוני נחשב לקוד לגיטימי של האתר הפרוץ, הוא יכול לקבל כל מידע הרלוונטי לאתר זה, כגון הרשאות כניסה של המשתמש לאתר. במקרים קיצוניים, למשל כאשר האתר נמצא ברשימת האתרים שהמשתמש התמים סומך עליהם, ניתן גם לנצל את הפרצה להרצת קוד זדוני בהרשאות של המשתמש עצמו. ראשי התיבות האמיתיים של Cross-site scripting הם CSS, אולם מקובל כיום להשתמש בקיצור CSS עבור שפת הסימון Cascading Style Sheets.

רקע[עריכת קוד מקור | עריכה]

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

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

סוגים של פרצות XSS[עריכת קוד מקור | עריכה]

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

XSS מקומי (Local XSS)[עריכת קוד מקור | עריכה]

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

XSS זמני (Non-persistent XSS)[עריכת קוד מקור | עריכה]

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

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

XSS קבוע (Persistent XSS)[עריכת קוד מקור | עריכה]

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

תרחישי ניצול אפשריים[עריכת קוד מקור | עריכה]

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

XSS מקומי[עריכת קוד מקור | עריכה]

  1. מלורי שולח כתובת של אתר אינטרנט (שהוא שולט בתוכן שלו) לאליס.
  2. אליס נכנסת לאתר
  3. האתר מכיל קוד JavaScript הפונה לדף HTML פגיע על מחשב של אליס
  4. ניצול החולשה באתר הפגיע גורם לקוד הזדוני של מלורי לרוץ בתוכו בהרשאות של עמוד מקומי.
  5. הקוד של מלורי יכול כעת לבצע כל פעולה בהרשאות המשתמש של אליס על המחשב שלה.

XSS זמני[עריכת קוד מקור | עריכה]

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

XSS קבוע[עריכת קוד מקור | עריכה]

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

דוגמאות לניצול של פרצות XSS[עריכת קוד מקור | עריכה]

ניתן למצוא באינטרנט מאות דוגמאות של ניצול פרצות XSS. להלן מספר דוגמאות בולטות.

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

הגנה מפרצות XSS[עריכת קוד מקור | עריכה]

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

לדוגמה, נניח שהמשתמש הכניס את המחרוזת הבאה:

<script>alert('xss');</script>

קידוד נכון של המחרוזת יהפוך אותה לצורה הזו:

&lt;script&gt;alert('xss');&lt;/script&gt;

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

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

קטגוריות דומות של פרצות אבטחה[עריכת קוד מקור | עריכה]

  • Cross Zone Scripting - פרצות המאפשרות מעבר בין אזורי אבטחה בדפדפן. פרצות XSS מקומיות הן לפעמים גם פרצות מסוג Cross Zone Scripting.
  • HTTP header injection - פרצות המתרחשות כאשר כותרות ה- HTTP נוצרות מתוכן המסופק על ידי המשתמש. פרצות מסוג זה לעתים מנוצלות על מנת ליצור תנאים מתאימים ל- XSS
  • Cross-site request forgery - למעשה פרצות אלו הן כמעט "ההפך" מ- XSS, במובן שבמקום לנצל את העובדה שהמשתמש בוטח באתר מסוים, פרצות אלו מנצלות את העובדה שאתר מסוים בוטח בתוכנה מסוימת.

קישורים חיצוניים[עריכת קוד מקור | עריכה]

מידע כללי[עריכת קוד מקור | עריכה]

שיטות לניצול XSS[עריכת קוד מקור | עריכה]

מניעה[עריכת קוד מקור | עריכה]

דוגמאות[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ [1] (הקישור אינו פעיל, 8.6.2012)