CSRF - קללה חדשה
אני מקווה שרובכם מכירים את נושא ה-XSS. הקשר שלי לתחום התחיל לפני חמש שנים בדיוק, כשהגעתי מתוך מחקר עצמי למסקנה שניתן לגנוב עוגיות, אבל לא הצלחתי בעזרת הידע המינימלי שהיה לי אז, לנצל אותן לאחר מעשה.
הפעם אציג בקצרה קללה חדשה מאותה המשפחה, ואת הדרכים להתגונן מולה. הכוונה ל-CSRF - כלומר Cross Site Request Forgery.
גם אליה הגעתי בעצמי, כאשר הגעתי למסקנה שניתן לחזור לשרת תחת העוגיות שלי, בעזרת כמה שיטות פשוטות, וגם ללא JS פעיל ניתן לבצע פעולות בשמי בשרת. חיפוש קצר בגוגל העלה שלא חשבתי ראשון (בלשון המעטה) על הבעיה ויש לה אפילו שם מקצועי.
בעבר נתקלתי בבעיה
המימוש הוא פשוט להחריד. הרבה יותר פשוט מאשר XSS הפופולארי. נניח שיש לי דף במערכת פורומים שיודע למחוק הודעות בשם /Forum/DelMsg.aspx?id=12345. בשלב הבא אני צריך רק להיכנס לפורום, ולשים בחתימה שלי תמונה:
<img style="display: none" src="/Forum/DelMsg.aspx?id=12345">
פשוט להחריד. ברגע שמנהל הפורום יכנס לדף, אוטו' ההודעה תימחק על ידו תוך שימוש בעוגיה או ב-Session שלו. לבדוק Referer בצד שרת יהיה מעשה חסר תועלת, לאור העובדה שהדפים הגיעו מהאתר שלי בסך הכל.
גם אם אין באתר פורום או מקום דומה שמאפשר HTML עם תמונות למשל (ובעצם כל אלמנט אחר שחוזר לשרת,CSS למשל), עדיין ניתן לבצע את אותו דבר בדיוק בעזרת אתר אחר.
<script src="http://www.mysite.net/Forum/DelMsg.aspx?id=12345"></script>
ירוץ בכיף, תחת העוגיות של המנהל באתר השני, וללא ידיעתו כאשר יכנס לדף, גם אם הוא בדומיין אחר. אפשרות מכוערת יותר היא location.href או Redirect כלשהו וגם היא תעבוד מצויין. במקרה הזה דווקא Referer כן יכול לעזור.
מה עושים?
הכי פשוט - להחביא את כתובות תפריטי הניהול מכלל המשתמשים. חוסך מגולשים נטולי הרשאות לדעת את ה-URLים של ה"אוייב". עדיף גם לשבור את פורמט הקישורים שלכם באתר ולתת שם בלתי צפוי.
במידה ויש צורך לחשוף את הקישורים לגולשים, ניתן לחשוב על פיתרון יצירתי בסגנון CAPTCHA, ולוודא שהוא לא פוגע יותר מדי בחווית המשתמש של המנהל שלא יאהב הקלדה חוזרת ונשנית של מספרים או אותיות חסרות ערך על כל מחיקה מסכנה.
אפשר לנסות להשתמש ב-POST במקום ב-GET להעברת הנתונים, מה שיוכל לפתור את הבעיה חלקית (עדיין ניתן יהיה לייצר באתר אחר טופס שיעדו הוא http://www.mysite.net/Forum/DelMsg.aspx ומכיל <input type=hidden name=id value=12345> למשל, אבל אז עבודת הפיתוי תהיה קשה יותר).
אני עוד לא לגמרי סגור על דרכי התגוננות יעילים מול המפגע הזה. למעט הסתרה של ה-URL מה"אוייב" שנותנת מענה כמעט מושלם לבעיה בחלק מהמקרים, שאר האפשרויות פוגעות, בגדול בחווית המשתמש של המנהל וממררות את חייו או ממררות את חיי השרת.