סדרת המאמרים הזו נועדה כדי לסייע לסטודנטים שאני מלמד במקומות שונים. איכשהו תמיד חסרים לי מאמרים שאני יכול לשלוח לסטודנטים המסבירים למי שלומד מדעי המחשב דברים בסיסיים באבטחת מידע ובעברית. יש לא מעט מאמרים (אשתדל לתת קישורים איפה שיש) עם הסברים אבל ההסברים מיועדים לאנשים שלומדים אבטחת מידע ומכילים כבר מונחים מהתחום שפחות רלוונטיים לאנשים שצריכים ללמוד את המבוא. אז כדי לעזור לעצמי, כתבתי סדרת מאמרים שמסבירים מונחים בסיסיים באבטחת מידע ובדגש על ווב ופיתוח ומה שמפתחים מתחילים צריכים לדעת. במאמר זה אני מסביר על התקפה פשוטה בשם IDOR. ראשי תבות של Insecure direct object references – נשמע מפחיד אבל באמת פשוט.
במאמר הקודם דיברנו על DOS ו-DDOS.
בקשות
כשאנו מבצעים פעולות שונות באתר אינטרנט, אנו שולחים אליו בקשה. זה נשמע קצת מצחיק אם מתרגמים את זה להתנהגות אנושית אבל זה בדיוק ככה. כדי לבצע פעולה, אני שולח בקשה לאתר האינטרנט – או יותר נכון התוכנה שמריצה את אתר האינטרנט שיושבת על שרת האינטרנט. בקשה יכולה להיות למשל:
- תביא לי את העמוד הראשי של האתר.
- תביא לי את מאמר מספר 10763.
- תרשום את הטוקבק הזה.
- תביא לי את התמונה הזו.
- תעביר את הכסף לחשבון הזה.
מאחורי כל פעולה שאנו עושים באינטרנט יש בקשה. לפעמים באתר אינטרנט יש עשרות בקשות. אנחנו יכולים לראות אותן באמצעות כלי המפתחים. כלי המפתחים, למי שלא מכיר, זה כלי הנמצא בדפדפן ומשמש מתכנתים על מנת לבנות ולמצוא תקלות (נקרא לדבג) באתרי אינטרנט ובממשקים שונים. נכנסים אליו באמצעות F12 בחלונות או באמצעות Option + ⌘ + J במק. יש שם מספר לשוניות ומה שמעניין אותנו היא לשונית ה-network. נבחר בה ואז נקליד כתובת של אתר כלשהו. למשל internet-israel.com.
יש לא פחות מ-90 בקשות לאתר הזה! אחת לעמוד הראשי, חלק מהן לקבצים שונים ולתמונות. בואו ונבחר תמונה אחת ונראה מה זו בקשה.
מה שקורה הוא שמאחורי הקלעים, בזמן שאנו מחכים לאתר שייטען, רצות אצות להן הבקשות ומתמלאות. תמונה, סרטון, עוד תמונה. וכך בעצם האתר מתמלא בתוכן.
אם נלחץ על הכפתור הימני, נראה שיש לנו יכולת לפתוח את הבקשה בחלון אחר.
אם נבחר בה תפתח לנו לשונית עם התמונה – בעצם תוצאות של הבקשה.
אם נרפרש את הבקשה נקבל שוב את התמונה. וזה הבסיס של ההתקפה – תוקף בעצם מבצע בקשות שונות על מנת לקבל מידע.
במקרה הזה כמובן לא צריך לנחש בכלל, אני יכול להכנס לאתר ולראות את הבקשה ולקבל את המידע באופן פומבי. אבל מה קורה אם מדובר באתר סודי? במקרה הזה, משתף פעולה יכול להעתיק את הבקשה ולשלוח לתוקף. אם אין הגנה לאתר, התוקף יוכל לקבל את התמונה הסודית.
ניחוש כתובת המשאב
איך מקבלים את התמונה? נסתכל על הכתובת: https://internet-israel.com/wp-content/uploads/2023/01/%D7%A8%D7%9F-%D7%91%D7%A8-%D7%96%D7%99%D7%A7-%D7%AA%D7%9E%D7%95%D7%A0%D7%94-%D7%A8%D7%A9%D7%9E%D7%99%D7%AA-2023-%D7%92%D7%95%D7%93%D7%9C-%D7%A7%D7%98%D7%9F-%D7%A8%D7%99%D7%91%D7%95%D7%A2-300×293.jpg
זו כתובת שקשה לנחש. אבל אם היתה לנו למשל כתובת אחרת, למשל:
https://internet-israel.com/wp-content/uploads/2023/01/1.jpg
ונניח התמונה הזו היתה סודית, הייתם יכולים לנסות ולנחש כתובת של תמונה אחרת שנמצאת על השרת? הנה למשל דוגמה לניחוש מוצלח
https://internet-israel.com/wp-content/uploads/2023/01/2.jpg
או למשל:
https://internet-israel.com/wp-content/uploads/2023/01/3.jpg
למה קל לנו לנחש? כי 1,2,3 זו סדרה חשבונאית ותבנית שקל לנו לנחש. גם אם זה היה a, b ו-c זה היה לנו קל לנחש.
נדגים עם אתר אחר. בואו ונדמיין אתר, למשל של כביש… אה… 666. כביש 666 הוא כביש אגרה. אנחנו יכולים לצפות בחשבוניות שלנו. אנו מבצעים הזדהות ונכנסים לאתר. אבל כשובבים אנחנו פותחים את כלי המפתחים ורואים שהבקשה לחשבונית נראית כך:
https://road-666.co.il?invoice=120120
נלחץ על הכפתור הימני ו״הצג בלשונית נפרדת״ ונראה שאנו מקבלים חשבונית עם הפרטים שלנו. אבל אם אנחנו רוצים להיות שובבים יותר גדולים, ננסה לפתוח משהו כזה:
https://road-666.co.il?invoice=120121
מה יקרה לפי דעתכם? האם נראה שנקבל חשבונית של מישהו אחר? התשובה היא, לפחות במקרה של כביש 6, חיובית לגמרי, ראו את הקישור הזה.
בואו ניתן דוגמה אחרת. למשל אתר אינטרנט שמציג לנו את פרטי החוגים שהילדים שלנו לומדים. אנחנו נכנסים לאתר, מזינים את מספר תעודת הזהות שלנו (נדמיין שהוא 6382020) ומקבלים את הנתונים. אם נפתח את כלי המפתחים, אולי נראה שיוצאת בקשה לשרת האתר – משהו בסגנון:
https://hugim-yeladim.com?id=6382020
מה יקרה אם נקליד מספר תעודת זהות אחרת? למשל של השכן שלנו? תעודת הזהות שלו היא 6662121.
https://hugim-yeladim.com?id=6662121
האם נראה את פרטי החוגים שלו?
הסיבה לפירצה הזו היא שמתכנתים הרבה פעמים אוהבים להשתמש במשאבים ובמידע במספרים רצים, או במספרים מזהים מוכרים כמו תעודת זהות, מספר אישי או נתונים אחרים. אם נסתכל בבקשות, נוכל לנחש את המספרים ולהשיג גישה אל המשאב בדרך זו או אחרת. כאשר יש כמה וכמה דרכים. נכון, מתכנתים אמורים לחסום גישה למשאבים שאנחנו לא אמורים לראות, אבל זה לא תמיד קורה.
תוקף מרושע יכול לעבור באופן סדרתי על כל המשאבים וכך בעצם לשתות את כל המידע של האתר. לא נעים לי לומר, אבל זו אחת החולשות האהובות עלי ביותר ואני משתמש בה המון.
הנזק
הנזק יכול להיות באמת מחריד, תלוי במידע שנחשף. בכל מקרה זה דליפת מידע על כל המשתמע מכך.
מניעה
המניעה הראשונית היא לא להשתמש בערך שאפשר לנחש. יש לא מעט ספריות קוד במגוון שפות המאפשרות לנו לקבוע מספר משאב רנדומלי באמצעות פונקצית תמצות מחוכמת. כדאי לשים לב שלא להשתמש בפונקצית תמצות פשוטה מדי.
בנוסף כדאי מאד להקפיד על Access control על מנת למנוע גישה למשאבים על ידי לא מורשים. אבל זה באמת סיפור אחר.