הרעלת מטמון - Web Cache Poisoning - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא Web Cache Poisoning. עבדו בסדר המוצג - הרמה עולה בהדרגה.
תרגיל 1 - הרעלה עם כותרת שאינה במפתח (Practitioner)¶
מעבדה: Web cache poisoning with an unkeyed header
משימה:
1. גלו כותרת שאינה במפתח המטמון אבל משפיעה על התגובה
2. השתמשו בכותרת הזו כדי להזריק JavaScript זדוני
3. הפעילו alert(document.cookie) על כל מבקר
רמז: נסו את הכותרת X-Forwarded-Host ובדקו אם הערך מופיע בתגובה. אם כן, הזריקו payload שסוגר את התגית הקיימת ופותח תגית script.
תרגיל 2 - הרעלה עם עוגיה שאינה במפתח (Practitioner)¶
מעבדה: Web cache poisoning with an unkeyed cookie
משימה:
1. מצאו עוגייה שמשפיעה על התגובה אבל אינה במפתח המטמון
2. השתמשו בעוגייה כדי להזריק JavaScript
3. הפעילו alert(1)
רמז: שלחו בקשה עם ערכי עוגיות שונים ובדקו איזה ערך מופיע בתגובה. העוגייה fehost נפוצה בתרחישים כאלה.
תרגיל 3 - הרעלה עם מספר כותרות (Practitioner)¶
מעבדה: Web cache poisoning with multiple headers
משימה:
1. הרעלה זו דורשת שילוב של שתי כותרות
2. מצאו את שתי הכותרות שביחד גורמות להפניה לדומיין שלכם
3. ארחו JavaScript זדוני ב-exploit server
4. הרעילו את המטמון כך שכל מבקר יופנה לסקריפט שלכם
רמז: נסו שילוב של X-Forwarded-Host ו-X-Forwarded-Scheme. אחת גורמת להפניה, השנייה קובעת את היעד.
תרגיל 4 - הרעלה ממוקדת עם Vary (Practitioner)¶
מעבדה: Targeted web cache poisoning using an unknown header
משימה:
1. מצאו כותרת שאינה במפתח שמאפשרת הזרקה
2. שימו לב לכותרת Vary בתגובה - היא כוללת User-Agent
3. גלו את ה-User-Agent של הקורבן (חפשו בפונקציונליות הקיימת)
4. הרעילו את המטמון רק עבור ה-User-Agent הספציפי של הקורבן
רמז: בדקו אם יש פונקציונליות תגובות (comments) שבה אפשר להטמיע HTML שמדווח את ה-User-Agent.
תרגיל 5 - הרעלה דרך הבדלי נרמול URL (Practitioner)¶
מעבדה: Web cache poisoning via an unkeyed query string
משימה:
1. מצאו שהמטמון מתעלם מה-query string במפתח
2. הזריקו JavaScript דרך פרמטר query שמופיע בתגובה
3. הפעילו alert(1)
רמז: שלחו בקשה עם cache buster ב-query string. אם בקשה ללא ה-cache buster מחזירה hit עם אותה תגובה - ה-query string לא במפתח.
תרגיל 6 - הרעלה דרך פרמטר שאינו במפתח (Practitioner)¶
מעבדה: Web cache poisoning via an unkeyed query parameter
משימה:
1. חלק מהפרמטרים נכללים במפתח וחלק לא
2. מצאו פרמטר ספציפי שאינו במפתח (השתמשו ב-Param Miner)
3. הזריקו XSS דרך הפרמטר הזה
רמז: פרמטרי UTM (utm_content, utm_source) לעתים קרובות אינם במפתח המטמון.
תרגיל 7 - הסתרת פרמטרים (Practitioner)¶
מעבדה: Parameter cloaking
משימה:
1. מצאו הבדל בפרסור query string בין המטמון לשרת
2. השתמשו בנקודה-פסיק (;) כמפריד פרמטרים
3. הסתירו פרמטר זדוני שהמטמון מתעלם ממנו אבל השרת מעבד
רמז:
המטמון רואה callback=setCountry (מפתח). השרת רואה את ;callback=alert(1) כפרמטר נפרד ומשתמש בו.
תרגיל 8 - הרעלה דרך בקשת GET עם גוף (Practitioner)¶
מעבדה: Web cache poisoning via a fat GET request
משימה:
1. שלחו בקשת GET עם גוף שמכיל פרמטר
2. גלו שהשרת מעדיף את הפרמטר מהגוף על זה מה-URL
3. הרעילו את המטמון
רמז:
GET /js/geolocate.js?callback=setCountry HTTP/1.1
Content-Type: application/x-www-form-urlencoded
callback=alert(1)
תרגיל 9 - הרעלה דרך נרמול URL (Practitioner)¶
מעבדה: URL normalization
משימה:
1. מצאו הבדל בנרמול URL בין המטמון לשרת
2. השרת מנרמל /<script>alert(1)</script> ומחזיר 404 עם הנתיב בתגובה
3. המטמון שומר תחת הנתיב המקורי (לא מנורמל)
4. שלחו לקורבן לינק לנתיב המקודד שיוגש מהמטמון
רמז: שלחו את הבקשה הזדונית כדי להרעיל, ואז שלחו לקורבן את ה-URL המקודד. הדפדפן ינרמל את ה-URL לפני השליחה ויקבל את התגובה המורעלת.
תרגיל 10 - הרעלה דרך import דינמי (Expert)¶
מעבדה: Web cache poisoning to exploit a DOM vulnerability via a cache with strict cacheability criteria
משימה:
1. מצאו משאב שהמטמון שומר עם קריטריונים מחמירים
2. גלו כותרת שמשפיעה על התגובה
3. נצלו חולשת DOM שמשתמשת בנתונים מהתגובה
4. הפעילו alert(document.cookie)
תרגיל 11 - הרעלה משולבת עם כותרת Vary (Expert)¶
מעבדה: Combining web cache poisoning vulnerabilities
משימה:
1. מצאו שתי חולשות הרעלה נפרדות
2. שלבו אותן לשרשרת תקיפה אחת
3. הפעילו alert(document.cookie) על הקורבן
תרגיל בונוס - סריקה אוטומטית¶
כתבו סקריפט Python שמבצע:
#!/usr/bin/env python3
"""
כתבו סקריפט שמקבל URL ומבצע:
1. בדיקה אם יש מטמון (חיפוש כותרות X-Cache, Age, CF-Cache-Status)
2. בדיקה אם ה-query string במפתח המטמון
3. בדיקת רשימה של כותרות נפוצות שעלולות להיות מחוץ למפתח
4. דיווח על ממצאים
הסקריפט צריך:
- לשלוח בקשות עם cache buster
- למדוד את כותרות התגובה
- להשוות תגובות עם ובלי הכותרת הנבדקת
"""
משאבים נוספים¶
- PortSwigger Web Security Academy - Web Cache Poisoning: https://portswigger.net/web-security/web-cache-poisoning
- מאמר המחקר של James Kettle: "Practical Web Cache Poisoning"
- מאמר המחקר: "Web Cache Entanglement"
- כלי Param Miner ל-Burp Suite