מבנה אתר - איך דפדפן והשרת מדברים¶
אתם מקלידים כתובת אתר בדפדפן, לוחצים אנטר, ותוך פחות משנייה העמוד כבר שם. זה נראה כמו קסם, אבל מאחורי הקלעים קורה שם רצף שלם ומסודר של שלבים, וכל שלב כזה הוא בעצם מקום שבו תוקף יכול לנסות לחפש חולשה. לפני שלומדים איך לפרוץ אתרים, חשוב באמת להבין איך הם עובדים כשהכל תקין, כי אי אפשר לזהות סטייה מהנורמה בלי לדעת מה הנורמה.
שלב ראשון - תרגום הכתובת לכתובת IP¶
כשאתם מקלידים כתובת כמו amittech.dev, הדפדפן לא באמת יודע איפה למצוא את האתר הזה. הוא פונה לשירות שנקרא DNS, שהוא בעצם ספר טלפונים ענק של האינטרנט, ומבקש ממנו את כתובת ה-IP שמתאימה לשם הדומיין. רק אחרי שהדפדפן מקבל כתובת IP, הוא בכלל יודע לאיזה שרת לפנות.
שלב שני - יצירת חיבור אמין - TCP¶
עכשיו, כשיש כתובת IP, הדפדפן צריך לפתוח ערוץ תקשורת אמין מול השרת. זה נעשה באמצעות פרוטוקול שנקרא TCP, שמבצע מה שנקרא "לחיצת יד משולשת" - שלוש הודעות קצרות שמוודאות ששני הצדדים מוכנים לתקשר, ושהחבילות שיישלחו יגיעו בסדר הנכון ובלי אובדן מידע. ברגע שהלחיצת יד הזאת מסתיימת, יש חיבור פתוח בין הדפדפן לשרת.
שלב שלישי - הצפנת הערוץ - TLS¶
ברוב האתרים היום, ברגע שהחיבור פתוח, מתחיל שלב נוסף שנקרא לחיצת יד TLS. השרת והדפדפן מסכימים על שיטת הצפנה משותפת, מאמתים את זהות השרת דרך תעודה דיגיטלית, ובונים מפתחות הצפנה זמניים שישמשו לכל שאר השיחה. זה בדיוק מה שהופך HTTP הרגיל ל-HTTPS, וזו הסיבה שהמנעול הקטן מופיע בשורת הכתובת.
שלב רביעי - בקשת HTTP¶
עכשיו, ורק עכשיו, הדפדפן שולח את הבקשה עצמה - בקשת HTTP. זו הודעת טקסט מובנית שאומרת לשרת בדיוק מה רוצים - איזה עמוד, באיזו שיטה (בדרך כלל GET לקבלת תוכן, או POST לשליחת נתונים כמו טופס), ומצרפת אליה מידע נוסף בכותרות - איזה דפדפן שולח את הבקשה, אילו קובצי Cookie קיימים, ועוד. הבקשה הזאת היא בדיוק המקום שבו כל תקיפת ווב מתחילה, כי כל מה שהתוקף שולט בו הוא בעצם תוכן הבקשה הזאת.
שלב חמישי - עיבוד הבקשה בשרת¶
כאן קורה העבודה האמיתית מצד השרת. אם מדובר בעמוד סטטי, השרת פשוט שולח את הקובץ המבוקש. אבל ברוב האתרים המודרניים, השרת מריץ קוד - ב-PHP, Node.js, Python או כל שפה אחרת - שמפענח את הבקשה, לפעמים פונה למסד נתונים כדי לשלוף או לעדכן מידע, ובונה את העמוד באמצעות מנוע תבניות שממלא נתונים דינמיים לתוך HTML. זה השלב שבו לוגיקת האפליקציה נכנסת לתמונה, וגם השלב שבו רוב חולשות הווב, מ-SQL Injection ועד לוגיקה עסקית שבורה, בעצם מתרחשות.
שלב שישי - תשובת HTTP¶
השרת בונה תשובה - קוד סטטוס שמתאר מה קרה (200 להצלחה, 404 לעמוד שלא נמצא, 500 לשגיאת שרת, ועוד), כותרות נוספות, ותוכן העמוד עצמו. התשובה הזאת חוזרת דרך אותו ערוץ מוצפן שנפתח קודם.
שלב שביעי - עיבוד ותצוגה בדפדפן¶
לבסוף, הדפדפן מקבל את התשובה, קורא את קוד ה-HTML, מוריד משאבים נוספים כמו תמונות וקבצי CSS ו-JavaScript, ומרנדר את כל זה לעמוד שאתם רואים על המסך. גם השלב הזה חשוב להבין, כי הרבה חולשות בצד לקוח, כמו XSS, קורות בדיוק כאן - כשקוד שהתוקף הצליח להחדיר רץ בתוך הדפדפן שלכם.
כל השלבים האלה ביחד הם בדיוק מה שקורס פריצת אתרים למתחילים בונה בהתחלה, לפני שבכלל מדברים על חולשה ראשונה - כי הבנה של הזרימה הרגילה הזאת היא מה שהופך למידה של חולשות מ"שינון" להבנה אמיתית.
יש לכם שאלות על אחד מהשלבים, או סתם רוצים לדבר עם אנשים שלומדים את זה? מוזמנים להצטרף לקהילה שלנו.
לסיכום¶
מרגע שהקלדתם כתובת ועד שהעמוד נטען, קורים כמה שלבים מסודרים - תרגום כתובת דרך DNS, חיבור אמין דרך TCP, הצפנה דרך TLS, בקשת HTTP, עיבוד בשרת, תשובה, ותצוגה בדפדפן. כל שלב כזה הוא חלק מהזרימה התקינה, וגם בדיוק המקום שבו כדאי לחפש כשמנסים להבין איפה משהו יכול להישבר.