מה זה CSS Injection - כשעיצוב הופך לכלי תקיפה¶
כשחושבים על חולשות אבטחה, CSS הוא בדרך כלל הדבר האחרון שעולה בראש. זו שפת עיצוב, לא שפת תכנות - איך אפשר לתקוף עם משהו שרק קובע צבעים וגדלים? מסתבר שאפשר, ובאופן מפתיע יעיל למדי. CSS Injection היא חולשה מזולזלת שיכולה לשמש גם להשחתת עמוד וגם לגניבת מידע רגיש, בלי שורת JavaScript אחת.
אז מה זה בעצם קורה שם¶
CSS Injection קורה כשקלט של משתמש מגיע, בלי סינון מתאים, לתוך הקשר של עיצוב - style - באתר. זה יכול לקרות בכמה דרכים:
- אתר שמאפשר למשתמשים להזין ערך שמוצג ישירות בתוך תכונת style של תג HTML.
- מערכת שמאפשרת למשתמש להזין תוכן, ובתוך התוכן הזה מוטמע תג
<style>שלם שהאתר לא מסנן כמו שצריך. - פיצ'ר של "עיצוב מותאם אישית" שנועד לתת למשתמשים גמישות, ובפועל מאפשר להזריק כללי CSS כמעט חופשיים.
ברגע שתוקף מצליח להטמיע כלל CSS משלו לתוך הדף, הוא בעצם קיבל שליטה חלקית על איך העמוד נראה ומתנהג, מנקודת המבט של מי שגולש בו.
הפעלה שהכי מפתיעה - דליפת מידע דרך בוררי CSS¶
הרעיון הזה נשמע לא הגיוני בהתחלה, אז בואו נפרק אותו. ב-CSS יש דבר שנקרא בורר תכונה - attribute selector - שמאפשר לבחור אלמנט לפי הערך שיש לו בתכונה מסוימת. למשל, אפשר לכתוב כלל שאומר "אם לשדה קלט יש ערך שמתחיל באות א, תטען תמונת רקע ממקום מסוים". התמונה הזאת יכולה להיות כתובת שמצביעה לשרת של התוקף.
עכשיו תדמיינו שתוקף מגדיר כלל כזה לכל אות אפשרית - כלל אחד לכל תו שהערך יכול להתחיל בו. אם הדפדפן טוען את תמונת הרקע המתאימה לתו הראשון של ערך נסתר בדף, השרת של התוקף רואה איזו בקשה הגיעה, ומזה הוא יודע מה התו הראשון. חוזרים על התהליך תו אחרי תו, ובאיטיות, בלי שום JavaScript, אפשר לשחזר ערך שלם שהיה אמור להיות מוסתר מהעין - למשל token בתוך שדה נסתר בדף. זה איטי ומסורבל בהשוואה לחולשות אחרות, אבל הוא עובד גם במקומות שבהם JavaScript נחסם לגמרי, וזו בדיוק הסיבה שהוא מעניין.
שימושים נוספים - השחתה ו-UI redress¶
מעבר לדליפת מידע, CSS מאפשר גם דברים פשוטים יותר להבין. תוקף שמצליח להזריק כללי עיצוב יכול פשוט להשחית - deface - את העמוד: להסתיר תוכן אמיתי, להציג טקסט מזויף, או לשנות את המראה של האתר לגמרי. הוא יכול גם למקם אלמנטים שקופים מעל כפתורים לגיטימיים, כדי לגרום למשתמש ללחוץ במקום אחר ממה שהוא חושב - וריאציה שקרובה מאוד לרעיון שעומד מאחורי clickjacking.
איך מגנים מפני CSS Injection¶
- מדיניות אבטחת תוכן - CSP. הגדרת כותרת Content-Security-Policy שמגבילה מאיפה מותר לטעון תמונות וקבצי עיצוב, חוסמת את היכולת של תוקף לגרום לדפדפן לפנות לשרת שלו כדי לדלוף מידע.
- לא להזרים קלט משתמש ישירות להקשר של style. אם חייבים לאפשר עיצוב מותאם אישית, צריך לעבור דרך רשימת ערכים מאושרת, ולא לקבל כל מחרוזת שמגיעה מהמשתמש.
- סינון וניקוי תוכן שמגיע ממשתמשים. כל תוכן שמותר למשתמש להזין ומוצג לאחרים צריך לעבור ניקוי שמסיר תגי style וכל תכונת style חשודה, בדיוק כמו שמנקים מפני XSS.
- הימנעות משיקוף ישיר של קלט לתוך HTML בלי בריחה - escaping מתאימה, כדי שערך שהמשתמש הזין לא יוכל "לצאת" מההקשר שבו הוא אמור להישאר.
למה שווה להכיר את זה¶
CSS Injection מוכיחה נקודה חשובה - כמעט כל מנגנון שמאפשר למשתמש להשפיע על מה שמוצג בדף, גם אם הוא נראה תמים כמו עיצוב, יכול להפוך לכלי תקיפה בידיים הנכונות. זו בדיוק סוג החשיבה שמבדיל בין מי שרק מכיר רשימת חולשות לבין מי שבאמת יודע לחשוב כמו תוקף.
אם אתם רוצים להעמיק בסוגי החולשות האלה ולתרגל אותן בסביבה חוקית ומסודרת, מוזמנים לעבור על קורס פריצת אתרים למתחילים.
יש לכם שאלה על משהו שלא היה ברור, או שאתם רוצים לדבר על חולשות מעניינות אחרות? בואו לדיסקורד שלנו.
לסיכום¶
CSS Injection מזכירה שאבטחת אתרים לא מסתכמת רק בקלט שמגיע לשרת - גם מה שקורה בצד הלקוח, כולל דברים שנראים "רק עיצוביים", יכול לדלוף מידע או לתעתע במשתמש. הבנת החולשה הזו מלמדת חשיבה רחבה יותר על כל דבר שתוקף יכול לשלוט בו בדף, לא משנה כמה הוא נראה תמים.