הטעיית cache - Web Cache Deception - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא Web Cache Deception. תקיפות אלו דורשות הבנה של אופן פעולת הcache וההבדלים בפרשנות נתיבים בין מרכיבים שונים.
תרגיל 1 - הטעיה בסיסית עם סיומת סטטית (Practitioner)¶
מעבדה: Exploiting path mapping for web cache deception
משימה:
1. התחברו עם האישורים wiener:peter
2. גלו שנתיב /my-account מכיל מפתח API
3. הוסיפו segment עם סיומת סטטית לנתיב
4. גרמו לcache לשמור את הדף הפרטי
5. גשו לדף מגולמת (ללא Cookie) כדי לקרוא את מפתח ה-API
רמז: נסו נתיבים כמו:
תרגיל 2 - הטעיה עם מפריד נקודה-פסיק (Practitioner)¶
מעבדה: Exploiting path delimiters for web cache deception
משימה:
1. הסיומת הסטטית הפשוטה לא עובדת (השרת מחזיר 404)
2. בדקו מפרידים שונים שגורמים לשרת להתעלם מהחלק הנוסף
3. מצאו מפריד שעובד וגורם לcache לשמור את התגובה
4. גנבו את מפתח ה-API
רמז: נסו מפרידים שונים:
תרגיל 3 - הטעיה דרך נרמול נתיב (Practitioner)¶
מעבדה: Exploiting origin server normalization for web cache deception
משימה:
1. השרת מנרמל נתיבים (מעבד ..) אבל הcache לא
2. בנו נתיב שהcache רואה כקובץ סטטי אבל השרת מנרמל לדף דינמי
3. גנבו את מפתח ה-API
רמז:
/resources/..%2fmy-account
Cache: sees /resources/..%2fmy-account (in the resources folder, stores)
Server: normalizes to /my-account (private page)
תרגיל 4 - הטעיה דרך נרמול cache (Practitioner)¶
מעבדה: Exploiting cache server normalization for web cache deception
משימה:
1. הפעם הcache מנרמל נתיבים אבל השרת לא
2. מצאו את הכיוון ההפוך - נתיב שהcache מנרמל לנתיב סטטי
3. גנבו את מפתח ה-API
רמז:
/my-account/..%2fresources/test.css
Cache: normalizes to /resources/test.css (static, stores)
Server: does not normalize, returns /my-account (private page)
תרגיל 5 - הטעיה עם כלל cache ספציפי (Practitioner)¶
מעבדה: Exploiting exact-match cache rules for web cache deception
משימה:
1. הcache שומר רק נתיבים ספציפיים (exact match)
2. מצאו נתיב סטטי שהcache שומר
3. השתמשו בנרמול כדי לגרום לcache לשמור את הדף הפרטי תחת הנתיב הסטטי
רמז: חפשו קבצים סטטיים שהאתר משתמש בהם (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;
}
}
- בדקו אילו נתיבים הcache שומר
- בצעו תקיפת הטעיית cache ידנית
- כתבו סקריפט שמבצע את כל השלבים אוטומטית
תרגיל 7 - מיפוי התנהגות cache¶
כתבו סקריפט שממפה את התנהגות הcache של יעד:
#!/usr/bin/env python3
"""
Write a script that checks:
1. Which file extensions the cache stores (.css, .js, .png, .jpg, .gif, .ico, .woff, .svg)
2. Which delimiters the server recognizes (/, ;, %00, %23, %3f)
3. Whether the cache normalizes paths (..%2f)
4. Whether the server normalizes paths
5. What the cache key includes (query string, headers)
The script should return a matrix of combinations that work.
"""
משאבים נוספים¶
- 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"