הטעיית מטמון - Web Cache Deception - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא Web Cache Deception. תקיפות אלו דורשות הבנה של אופן פעולת המטמון וההבדלים בפרשנות נתיבים בין מרכיבים שונים.
תרגיל 1 - הטעיה בסיסית עם סיומת סטטית (Practitioner)¶
מעבדה: Exploiting path mapping for web cache deception
משימה:
1. התחברו עם האישורים wiener:peter
2. גלו שנתיב /my-account מכיל מפתח API
3. הוסיפו segment עם סיומת סטטית לנתיב
4. גרמו למטמון לשמור את הדף הפרטי
5. גשו לדף מגולמת (ללא Cookie) כדי לקרוא את מפתח ה-API
רמז: נסו נתיבים כמו:
תרגיל 2 - הטעיה עם מפריד נקודה-פסיק (Practitioner)¶
מעבדה: Exploiting path delimiters for web cache deception
משימה:
1. הסיומת הסטטית הפשוטה לא עובדת (השרת מחזיר 404)
2. בדקו מפרידים שונים שגורמים לשרת להתעלם מהחלק הנוסף
3. מצאו מפריד שעובד וגורם למטמון לשמור את התגובה
4. גנבו את מפתח ה-API
רמז: נסו מפרידים שונים:
תרגיל 3 - הטעיה דרך נרמול נתיב (Practitioner)¶
מעבדה: Exploiting origin server normalization for web cache deception
משימה:
1. השרת מנרמל נתיבים (מעבד ..) אבל המטמון לא
2. בנו נתיב שהמטמון רואה כקובץ סטטי אבל השרת מנרמל לדף דינמי
3. גנבו את מפתח ה-API
רמז:
/resources/..%2fmy-account
המטמון: רואה /resources/..%2fmy-account (בתיקיית resources, שומר)
השרת: מנרמל ל-/my-account (דף פרטי)
תרגיל 4 - הטעיה דרך נרמול מטמון (Practitioner)¶
מעבדה: Exploiting cache server normalization for web cache deception
משימה:
1. הפעם המטמון מנרמל נתיבים אבל השרת לא
2. מצאו את הכיוון ההפוך - נתיב שהמטמון מנרמל לנתיב סטטי
3. גנבו את מפתח ה-API
רמז:
/my-account/..%2fresources/test.css
המטמון: מנרמל ל-/resources/test.css (סטטי, שומר)
השרת: לא מנרמל, מחזיר /my-account (דף פרטי)
תרגיל 5 - הטעיה עם כלל מטמון ספציפי (Practitioner)¶
מעבדה: Exploiting exact-match cache rules for web cache deception
משימה:
1. המטמון שומר רק נתיבים ספציפיים (exact match)
2. מצאו נתיב סטטי שהמטמון שומר
3. השתמשו בנרמול כדי לגרום למטמון לשמור את הדף הפרטי תחת הנתיב הסטטי
רמז: חפשו קבצים סטטיים שהאתר משתמש בהם (JavaScript, CSS) ובנו נתיב שמנורמל אליהם.
תרגיל 6 - בנייה ידנית של שרשרת תקיפה¶
משימה עצמאית:
הקימו סביבת בדיקה מקומית:
# app.py - Flask application
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/profile')
@app.route('/profile/<path:path>')
def profile(path=''):
resp = make_response(f"""
<html>
<h1>Profile</h1>
<p>Username: admin</p>
<p>Email: admin@company.com</p>
<p>API Key: sk-secret-12345-abcde</p>
</html>
""")
resp.headers['Content-Type'] = 'text/html'
return resp
if __name__ == '__main__':
app.run(port=5000)
# nginx.conf - reverse proxy with caching
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m;
server {
listen 80;
location ~* \.(css|js|png|jpg|gif|ico)$ {
proxy_cache my_cache;
proxy_cache_valid 200 1h;
add_header X-Cache $upstream_cache_status;
proxy_pass http://127.0.0.1:5000;
}
location / {
proxy_pass http://127.0.0.1:5000;
}
}
- בדקו אילו נתיבים המטמון שומר
- בצעו תקיפת הטעיית מטמון ידנית
- כתבו סקריפט שמבצע את כל השלבים אוטומטית
תרגיל 7 - מיפוי התנהגות מטמון¶
כתבו סקריפט שממפה את התנהגות המטמון של יעד:
#!/usr/bin/env python3
"""
כתבו סקריפט שבודק:
1. אילו סיומות קבצים המטמון שומר (.css, .js, .png, .jpg, .gif, .ico, .woff, .svg)
2. אילו מפרידים השרת מזהה (/, ;, %00, %23, %3f)
3. האם המטמון מנרמל נתיבים (..%2f)
4. האם השרת מנרמל נתיבים
5. מה cache key כולל (query string, headers)
הסקריפט צריך להחזיר מטריצה של שילובים שעובדים.
"""
משאבים נוספים¶
- PortSwigger Web Security Academy - Web Cache Deception: https://portswigger.net/web-security/web-cache-deception
- מאמר המחקר המקורי של Omer Gil: "Web Cache Deception Attack"
- מאמר המחקר של PortSwigger: "Gotta Cache 'Em All"