לדלג לתוכן

הטעיית מטמון - 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

רמז: נסו נתיבים כמו:

/my-account/test.css
/my-account/x.js
/my-account/anything.png

תרגיל 2 - הטעיה עם מפריד נקודה-פסיק (Practitioner)

מעבדה: Exploiting path delimiters for web cache deception

משימה:
1. הסיומת הסטטית הפשוטה לא עובדת (השרת מחזיר 404)
2. בדקו מפרידים שונים שגורמים לשרת להתעלם מהחלק הנוסף
3. מצאו מפריד שעובד וגורם למטמון לשמור את התגובה
4. גנבו את מפתח ה-API

רמז: נסו מפרידים שונים:

/my-account;test.css
/my-account%00test.css
/my-account%23test.css
/my-account%3ftest.css

תרגיל 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;
    }
}
  1. בדקו אילו נתיבים המטמון שומר
  2. בצעו תקיפת הטעיית מטמון ידנית
  3. כתבו סקריפט שמבצע את כל השלבים אוטומטית

תרגיל 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"