לדלג לתוכן

תקיפת OAuth 2.0 - תרגיל

תרגיל 1: מניפולציית Redirect URI

רקע

אפליקציה מאפשרת התחברות באמצעות OAuth. השרת בודק שה-redirect_uri שייך לדומיין של האפליקציה, אך הבדיקה אינה מדויקת.

משימות

  1. היכנסו לאפליקציה וזהו את זרימת ה-OAuth
  2. יירטו את בקשת ה-authorize עם Burp
  3. נסו לשנות את ה-redirect_uri לכתובת חיצונית
  4. אם נחסם - נסו את טכניקות העקיפה הבאות:
  5. הוספת path אחרי ה-callback (/callback/../something)
  6. שימוש ב-subdomain (evil.app.com)
  7. קידוד URL כפול
  8. הוספת פרמטרים נוספים
  9. גנבו את ה-authorization code באמצעות ה-exploit server
  10. החליפו אותו בטוקן והשתלטו על חשבון האדמין

מעבדת PortSwigger

בצעו את המעבדות:
- Authentication bypass via OAuth implicit flow
- Forced OAuth profile linking
- OAuth account hijacking via redirect_uri


תרגיל 2: CSRF ב-OAuth - חוסר פרמטר State

רקע

אפליקציה מאפשרת לקשר חשבון OAuth חיצוני לחשבון הקיים, אך לא משתמשת ב-state parameter.

משימות

  1. צרו חשבון באפליקציה והתחברו
  2. התחילו את תהליך קישור חשבון OAuth
  3. יירטו את ה-callback עם ה-authorization code
  4. אל תשלימו את התהליך - שמרו את ה-callback URL
  5. שלחו את ה-callback URL לקורבן (הנחה: הקורבן מחובר לאפליקציה)
  6. כאשר הקורבן לוחץ, חשבונו מקושר לחשבון ה-OAuth שלכם
  7. התחברו עם חשבון ה-OAuth שלכם וקיבלו גישה לחשבון הקורבן

כתבו payload

<!-- השלימו את ה-HTML שישלח לקורבן -->
<html>
<body>
    <!-- iframe/img שיפעיל את ה-callback -->
</body>
</html>

תרגיל 3: דליפת טוקן דרך Open Redirect

רקע

אפליקציה מאמתת שה-redirect_uri מצביע על הדומיין שלה, אך יש בה open redirect.

משימות

  1. מצאו open redirect באפליקציה (סרקו עם Burp)
  2. שרשרו את ה-open redirect עם ה-redirect_uri של OAuth
  3. השתמשו ב-implicit flow כדי לגנוב את הטוקן ב-fragment
  4. הקימו שרת שקולט את הטוקן
  5. בצעו את התקיפה על הקורבן

שאלות

  1. מדוע open redirect הוא כל כך מסוכן בהקשר של OAuth?
  2. איך fragment (#) מתנהג לעומת query parameter (?) בהפניות?
  3. האם PKCE מגן מפני תקיפה זו? הסבירו.

מעבדת PortSwigger

בצעו את המעבדה:
Stealing OAuth access tokens via an open redirect


תרגיל 4: ניצול Scope ו-Profile Information

רקע

אפליקציה משתמשת ב-OAuth להתחברות ושולפת פרטי משתמש מהספק. השרת סומך על המידע שמגיע מהספק ללא אימות נוסף.

משימות

  1. התחברו עם חשבון OAuth
  2. בדקו אילו שדות האפליקציה מקבלת מהספק (email, name, role)
  3. בדקו אם ניתן לשנות את הפרטים בספק ה-OAuth
  4. שנו את ה-email לזה של האדמין
  5. התחברו מחדש ובדקו אם קיבלתם גישה לחשבון האדמין

מעבדת PortSwigger

בצעו את המעבדה:
SSRF via OpenID dynamic client registration


תרגיל 5: PKCE Downgrade

רקע

אפליקציה מיישמת PKCE, אך שרת ה-OAuth לא דורש אותו באופן מחייב.

משימות

  1. יירטו את זרימת ה-OAuth וזהו את השימוש ב-PKCE
  2. שלחו בקשת authorize חדשה ללא code_challenge
  3. בדקו אם השרת מקבל את הבקשה ללא PKCE
  4. גנבו authorization code (באמצעות redirect_uri manipulation)
  5. החליפו אותו בטוקן ללא צורך ב-code_verifier

תרגיל 6: סקריפט סריקת OAuth

כתבו סקריפט Python שמבצע את הבדיקות הבאות באופן אוטומטי:

# השלימו את הסקריפט
import requests

class OAuthScanner:
    def __init__(self, authorize_url, token_url, client_id, redirect_uri):
        self.authorize_url = authorize_url
        self.token_url = token_url
        self.client_id = client_id
        self.redirect_uri = redirect_uri

    def check_state_required(self):
        """בדיקה אם state נדרש"""
        # ...
        pass

    def check_redirect_uri_validation(self):
        """בדיקת אימות redirect_uri"""
        # נסו וריאציות שונות
        # ...
        pass

    def check_pkce_required(self):
        """בדיקה אם PKCE נדרש"""
        # ...
        pass

    def check_scope_validation(self):
        """בדיקה אם scope מאומת"""
        # ...
        pass

    def run_all_checks(self):
        """הרצת כל הבדיקות"""
        self.check_state_required()
        self.check_redirect_uri_validation()
        self.check_pkce_required()
        self.check_scope_validation()

הסקריפט צריך לבדוק

  1. האם state parameter נדרש
  2. האם redirect_uri מאומת (ואם כן - כמה בחוזקה)
  3. האם PKCE נדרש
  4. האם ניתן לבקש scope מורחב
  5. האם authorization code חד-פעמי
  6. האם ניתן לבצע token exchange ללא client_secret

תרגיל 7: תקיפת OAuth מלאה

תרחיש

נתונה אפליקציה שמאפשרת התחברות עם Google OAuth. בצעו את השלבים הבאים:

  1. מפו את זרימת ה-OAuth המלאה (כל הבקשות והתגובות)
  2. זהו את סוג הזרימה (Authorization Code / Implicit)
  3. בדקו את כל נקודות התורפה שלמדנו
  4. תעדו כל ממצא עם דוגמת בקשה ותגובה
  5. הציעו תיקונים לכל חולשה שמצאתם

דוח

הגישו דוח שכולל:
- תרשים זרימה של ה-OAuth flow
- רשימת חולשות שנמצאו
- PoC (הוכחת יתכנות) לכל חולשה
- המלצות תיקון