תנאי מרוץ - Race Conditions - תרגול¶
תרגיל 1 - עקיפת מגבלת שימוש בקוד הנחה (Apprentice)¶
מעבדה: Limit overrun race conditions (PortSwigger)
רקע:
חנות מקוונת מאפשרת שימוש בקוד הנחה PROMO20 פעם אחת בלבד. המטרה: להחיל את ההנחה מספר פעמים ולרכוש מוצר במחיר מופחת.
שלבים:
- התחברו לחשבון עם הפרטים הנתונים
- הוסיפו מוצר לעגלה
- החילו את קוד ההנחה
PROMO20פעם אחת דרך Burp ולכדו את הבקשה - שלחו את הבקשה ל-Burp Repeater
- שכפלו את הטאב 20 פעמים (Ctrl+R)
- בחרו את כל הטאבים וצרו קבוצה
- הגדירו את מצב השליחה ל-"Send group in parallel (single-packet attack)"
- שלחו את הקבוצה
- בדקו את העגלה - כמה פעמים הוחלה ההנחה?
שאלות:
- למה חשוב להשתמש ב-single-packet attack ולא בשליחה רגילה?
- מה חלון הזמן שמנצלים כאן?
תרגיל 2 - עקיפת אימות מרובה שלבים (Practitioner)¶
מעבדה: Bypassing rate limits via race conditions (PortSwigger)
רקע:
מערכת כניסה מגבילה את מספר הניסיונות לסיסמה. המטרה: לנצל תנאי מרוץ כדי לעקוף את המגבלה ולמצוא את הסיסמה הנכונה.
שלבים:
- נסו להתחבר עם סיסמה שגויה מספר פעמים וזהו את המגבלה
- הבינו את המנגנון - האם המגבלה נבדקת לפני או אחרי אימות הסיסמה?
- צרו סקריפט ב-Turbo Intruder ששולח מספר ניסיונות סיסמה בו-זמנית
- השתמשו ברשימת הסיסמאות הנתונה
- שלחו קבוצות של בקשות עם סיסמאות שונות בתקיפת single-packet
רמז: אם המגבלה היא 3 ניסיונות, שלחו קבוצות של 3 סיסמאות בו-זמנית. כולן יגיעו לפני שהמונה מתעדכן.
תרגיל 3 - תנאי מרוץ מרובה נקודות קצה (Practitioner)¶
מעבדה: Multi-endpoint race conditions (PortSwigger)
רקע:
חנות מקוונת עם מנגנון תשלום בשני שלבים - הוספה לעגלה ותשלום. המטרה: לרכוש מוצר שמחירו גבוה מהיתרה שלכם.
שלבים:
- בדקו את תהליך הרכישה התקין ומצאו את נקודות הקצה הרלוונטיות
- הבינו את הסדר: הוספה לעגלה, הוספת קוד הנחה, ביצוע תשלום
- הוסיפו מוצר זול לעגלה והכינו את בקשת התשלום
- צרו קבוצת בקשות שכוללת:
- בקשה להחלפת המוצר בעגלה למוצר יקר
- בקשת תשלום
- שלחו את שתי הבקשות במקביל (single-packet attack)
- בדקו אם התשלום עבר על המחיר הזול בעוד שקיבלתם את המוצר היקר
רמז: ייתכן שתצטרכו לנסות מספר פעמים. תנאי מרוץ אינם דטרמיניסטיים.
תרגיל 4 - תנאי מרוץ של בנייה חלקית (Practitioner)¶
מעבדה: Partial construction race conditions (PortSwigger)
רקע:
אפליקציה שבה תהליך ההרשמה כולל מספר שלבים. המטרה: לגשת לחשבון לפני שההגדרות שלו הושלמו.
שלבים:
- בחנו את תהליך ההרשמה ומצאו את כל הבקשות שנשלחות
- זהו את נקודת הקצה ליצירת משתמש ואת נקודת הקצה להגדרת הרשאות
- נסו לשלוח בקשת כניסה מיד אחרי בקשת ההרשמה - לפני שההרשאות הוגדרו
- השתמשו ב-Turbo Intruder עם שתי שלבים:
- שלב 1: שליחת בקשת הרשמה
- שלב 2: שליחת מספר בקשות כניסה מיד לאחר מכן
- בדקו מה ההרשאות שקיבלתם
תרגיל 5 - תקיפה רגישה לזמן (Practitioner)¶
מעבדה: Exploiting time-sensitive vulnerabilities (PortSwigger)
רקע:
מערכת איפוס סיסמה שבה הטוקן נוצר על בסיס חותמת זמן. המטרה: ליצור טוקן איפוס זהה לזה של משתמש אחר.
שלבים:
- בקשו איפוס סיסמה לחשבון שלכם ובדקו את הטוקן שקיבלתם
- בקשו איפוס נוסף ובדקו אם הטוקנים שונים (וודאו שזה מבוסס זמן)
- הכינו שתי בקשות איפוס - אחת לחשבון שלכם ואחת לחשבון הקורבן
- שלחו את שתי הבקשות בו-זמנית באמצעות single-packet attack
- בדקו את הטוקן שקיבלתם ונסו להשתמש בו עבור חשבון הקורבן
רמז: הטוקנים צריכים להיות זהים אם נוצרו באותה שנייה עם אותו אלגוריתם.
תרגיל 6 - כתיבת סקריפט Turbo Intruder מתקדם (Expert)¶
כתבו סקריפט Turbo Intruder שמבצע את הפעולות הבאות:
- שליחת בקשת כניסה (login) עם פרטים תקינים
- חילוץ ה-session cookie מהתגובה
- שימוש בה-cookie לשליחת 30 בקשות מקביליות של מימוש כרטיס מתנה
- דיווח על מספר הבקשות שהצליחו
תבנית לסקריפט:
def queueRequests(target, wordlists):
engine = RequestEngine(
endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2
)
# שלב 1: התחברות
login_req = '''POST /login HTTP/2
Host: TARGET_HOST
Content-Type: application/x-www-form-urlencoded
username=wiener&password=peter'''
engine.queue(login_req, gate='login')
engine.openGate('login')
# TODO: חלצו את ה-session cookie מהתגובה
# TODO: שלחו 30 בקשות מקביליות עם ה-cookie
def handleResponse(req, interesting):
table.add(req)
השלימו את הסקריפט ובדקו אותו.
תרגיל 7 - תרגול כולל (Expert)¶
תרחיש:
חנות מקוונת עם היתרה 50 דולר. מוצר יעד במחיר 1337 דולר. יש לכם קוד הנחה חד-פעמי של 20%.
מטרה: רכשו את המוצר.
רמזים:
- שלב 1: החילו את ההנחה מספר פעמים באמצעות תנאי מרוץ
- שלב 2: אם ההנחה לא מספיקה, חפשו תנאי מרוץ נוסף בתהליך התשלום
- שלב 3: שלבו בין מספר טכניקות מרוץ
שאלות מנחות:
- כמה פעמים צריך להחיל את ההנחה כדי לרדת מתחת ל-50 דולר?
- האם יש נקודות קצה נוספות שאפשר לנצל?
- איך משלבים תקיפת single-packet עם מספר סוגי בקשות שונים?