הCache Poisoning - Web Cache Poisoning - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא Web Cache Poisoning. עבדו בסדר המוצג - הרמה עולה בהדרגה.
תרגיל 1 - poisoning עם header שאינה במפתח (Practitioner)¶
מעבדה: Web cache poisoning with an unkeyed header
משימה:
1. גלו header שאינה במפתח הcache אבל משפיעה על התגובה
2. השתמשו בheader הזו כדי להזריק JavaScript זדוני
3. הפעילו alert(document.cookie) על כל מבקר
רמז: נסו את הheader X-Forwarded-Host ובדקו אם הערך מופיע בתגובה. אם כן, הזריקו payload שסוגר את התגית הקיימת ופותח תגית script.
תרגיל 2 - poisoning עם עוגיה שאינה במפתח (Practitioner)¶
מעבדה: Web cache poisoning with an unkeyed cookie
משימה:
1. מצאו עוגייה שמשפיעה על התגובה אבל אינה במפתח הcache
2. השתמשו בעוגייה כדי להזריק JavaScript
3. הפעילו alert(1)
רמז: שלחו בקשה עם ערכי עוגיות שונים ובדקו איזה ערך מופיע בתגובה. העוגייה fehost נפוצה בתרחישים כאלה.
תרגיל 3 - poisoning עם מספר headers (Practitioner)¶
מעבדה: Web cache poisoning with multiple headers
משימה:
1. הPoisoning זו דורשת שילוב של שתי headers
2. מצאו את שתי הheaders שביחד גורמות להפניה לדומיין שלכם
3. ארחו JavaScript זדוני ב-exploit server
4. הרעילו את הcache כך שכל מבקר יופנה לסקריפט שלכם
רמז: נסו שילוב של X-Forwarded-Host ו-X-Forwarded-Scheme. אחת גורמת להפניה, השנייה קובעת את היעד.
תרגיל 4 - poisoning ממוקדת עם Vary (Practitioner)¶
מעבדה: Targeted web cache poisoning using an unknown header
משימה:
1. מצאו header שאינה במפתח שמאפשרת הזרקה
2. שימו לב לheader Vary בתגובה - היא כוללת User-Agent
3. גלו את ה-User-Agent של הקורבן (חפשו בפונקציונליות הקיימת)
4. הרעילו את הcache רק עבור ה-User-Agent הספציפי של הקורבן
רמז: בדקו אם יש פונקציונליות תגובות (comments) שבה אפשר להטמיע HTML שמדווח את ה-User-Agent.
תרגיל 5 - poisoning דרך הבדלי נרמול URL (Practitioner)¶
מעבדה: Web cache poisoning via an unkeyed query string
משימה:
1. מצאו שהcache מתעלם מה-query string במפתח
2. הזריקו JavaScript דרך פרמטר query שמופיע בתגובה
3. הפעילו alert(1)
רמז: שלחו בקשה עם cache buster ב-query string. אם בקשה ללא ה-cache buster מחזירה hit עם אותה תגובה - ה-query string לא במפתח.
תרגיל 6 - poisoning דרך פרמטר שאינו במפתח (Practitioner)¶
מעבדה: Web cache poisoning via an unkeyed query parameter
משימה:
1. חלק מהפרמטרים נכללים במפתח וחלק לא
2. מצאו פרמטר ספציפי שאינו במפתח (השתמשו ב-Param Miner)
3. הזריקו XSS דרך הפרמטר הזה
רמז: פרמטרי UTM (utm_content, utm_source) לעתים קרובות אינם במפתח הcache.
תרגיל 7 - הסתרת פרמטרים (Practitioner)¶
מעבדה: Parameter cloaking
משימה:
1. מצאו הבדל בפרסור query string בין הcache לשרת
2. השתמשו בנקודה-פסיק (;) כמפריד פרמטרים
3. הסתירו פרמטר זדוני שהcache מתעלם ממנו אבל השרת מעבד
רמז:
הcache רואה callback=setCountry (מפתח). השרת רואה את ;callback=alert(1) כפרמטר נפרד ומשתמש בו.
תרגיל 8 - poisoning דרך בקשת GET עם גוף (Practitioner)¶
מעבדה: Web cache poisoning via a fat GET request
משימה:
1. שלחו בקשת GET עם גוף שמכיל פרמטר
2. גלו שהשרת מעדיף את הפרמטר מהגוף על זה מה-URL
3. הרעילו את הcache
רמז:
GET /js/geolocate.js?callback=setCountry HTTP/1.1
Content-Type: application/x-www-form-urlencoded
callback=alert(1)
תרגיל 9 - poisoning דרך נרמול URL (Practitioner)¶
מעבדה: URL normalization
משימה:
1. מצאו הבדל בנרמול URL בין הcache לשרת
2. השרת מנרמל /<script>alert(1)</script> ומחזיר 404 עם הנתיב בתגובה
3. הcache שומר תחת הנתיב המקורי (לא מנורמל)
4. שלחו לקורבן לינק לנתיב המקודד שיוגש מהcache
רמז: שלחו את הבקשה הזדונית כדי להרעיל, ואז שלחו לקורבן את ה-URL המקודד. הדפדפן ינרמל את ה-URL לפני השליחה ויקבל את התגובה המורעלת.
תרגיל 10 - poisoning דרך import דינמי (Expert)¶
מעבדה: Web cache poisoning to exploit a DOM vulnerability via a cache with strict cacheability criteria
משימה:
1. מצאו משאב שהcache שומר עם קריטריונים מחמירים
2. גלו header שמשפיעה על התגובה
3. נצלו חולשת DOM שמשתמשת בנתונים מהתגובה
4. הפעילו alert(document.cookie)
תרגיל 11 - poisoning משולבת עם header Vary (Expert)¶
מעבדה: Combining web cache poisoning vulnerabilities
משימה:
1. מצאו שתי חולשות poisoning נפרדות
2. שלבו אותן לשרשרת תקיפה אחת
3. הפעילו alert(document.cookie) על הקורבן
תרגיל בונוס - סריקה אוטומטית¶
כתבו סקריפט Python שמבצע:
#!/usr/bin/env python3
"""
Write a script that receives a URL and performs:
1. Checking whether there is a cache (searching for X-Cache, Age, CF-Cache-Status headers)
2. Checking whether the query string is in the cache key
3. Checking a list of common headers that might be outside the key
4. Reporting the findings
The script should:
- Send requests with a cache buster
- Measure the response headers
- Compare responses with and without the tested header
"""
משאבים נוספים¶
- 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