השתלטות על חשבונות - תרגיל¶
תרגיל 1: הרעלת Host Header באיפוס סיסמה¶
רקע¶
אפליקציה מאפשרת איפוס סיסמה. כאשר מבקשים איפוס, המערכת שולחת מייל עם לינק. נבדוק אם ה-Host header משפיע על הלינק.
משימות¶
- גשו לדף "שכחתי סיסמה"
- בקשו איפוס עבור המשתמש שלכם (
wiener) ובדקו את המייל שהתקבל - שימו לב ל-URL של לינק האיפוס - מאיפה נלקח הדומיין?
- כעת בקשו איפוס עבור
carlosעם שינוי Host header:
- בדקו בלוג של exploit server אם הטוקן הגיע
- אם לא עבד, נסו:
X-Forwarded-Hostheader- כפל Host headers
- Host עם port
- השתמשו בטוקן שנלכד לאיפוס הסיסמה של carlos
מעבדת PortSwigger¶
בצעו את המעבדות:
- Basic password reset poisoning
- Password reset poisoning via middleware
- Password reset poisoning via dangling markup
תרגיל 2: חיזוי טוקן איפוס¶
רקע¶
אפליקציה מייצרת טוקני איפוס חלשים. עליכם לנתח את הדפוס ולחזות את הטוקן הבא.
משימות¶
- בקשו 10 טוקני איפוס עבור החשבון שלכם
- רשמו את כל הטוקנים ואת הזמן המדויק של כל בקשה
- נתחו את הטוקנים:
- מה האורך? האם הוא קבוע?
- נסו לפענח Base64/hex
- בדקו מתאם עם timestamp
- בדקו אם הם סדרתיים
- כתבו סקריפט שמחזה את הטוקן הבא
- בקשו איפוס עבור
carlosונסו לחזות את הטוקן
רמזים¶
# נסו את הבדיקות הבאות:
import hashlib
import base64
token = "THE_TOKEN_HERE"
# בדיקת Base64
try:
print(base64.b64decode(token))
except:
pass
# בדיקת MD5 של timestamp
for ts in range(int(time.time()) - 60, int(time.time()) + 1):
if hashlib.md5(str(ts).encode()).hexdigest() == token:
print(f"Token = MD5({ts})")
תרגיל 3: עקיפת אימות מייל¶
רקע¶
אפליקציה דורשת אימות מייל בהרשמה, אך ייתכן שהאימות חלש.
משימות¶
- הירשמו לאפליקציה עם מייל שלכם
- קבלו את לינק האימות ונתחו אותו
- בדקו:
- האם ניתן לשנות את כתובת המייל בלינק?
- האם הטוקן קשור למשתמש ספציפי?
- האם ניתן להשתמש בטוקן של משתמש אחד לאימות משתמש אחר?
- נסו להירשם עם מייל של הקורבן ולהשתמש בטוקן שלכם לאימות
- בדקו אם ניתן לגשת לפונקציות ללא אימות מייל
תרגיל 4: Race Condition בהרשמה¶
רקע¶
אפליקציה בודקת כפילויות בהרשמה, אך ייתכן שהבדיקה אינה אטומית.
משימות¶
- נסו להירשם פעמיים עם אותו מייל - ודאו שזה נחסם
- כעת שלחו 20 בקשות הרשמה במקביל עם אותו מייל
- בדקו כמה חשבונות נוצרו
- אם נוצרו כפילויות - מה ההשלכות?
סקריפט¶
# השלימו
import requests
import threading
TARGET = "https://TARGET_URL/register"
EMAIL = "test@test.com"
def register(password):
resp = requests.post(TARGET, json={
"email": EMAIL,
"password": password
})
print(f" [{password}] -> {resp.status_code}")
# שלחו 20 בקשות במקביל
threads = []
for i in range(20):
t = threading.Thread(target=register, args=(f"pass{i}",))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
תרגיל 5: שינוי סיסמה ללא אימות¶
רקע¶
אפליקציה מאפשרת שינוי סיסמה. בדקו אם ניתן לשנות את הסיסמה של משתמש אחר.
משימות¶
- שנו את הסיסמה שלכם בדרך הרגילה ויירטו את הבקשה
- בדקו אילו פרמטרים נשלחים:
- האם יש שדה
usernameאוuser_id? - האם הסיסמה הישנה נדרשת?
- האם יש טוקן CSRF?
- נסו:
- לשנות את ה-username/user_id למשתמש אחר
- להסיר את שדה הסיסמה הישנה
- לשלוח את הבקשה ללא cookie (בדיקת access control)
בקשה לדוגמה¶
POST /change-password HTTP/1.1
Cookie: session=YOUR_SESSION
{
"username": "carlos",
"current_password": "",
"new_password": "hacked123"
}
תרגיל 6: ניצול Social Login¶
רקע¶
אפליקציה מאפשרת קישור חשבון OAuth. בדקו אם ניתן לקשר את חשבון ה-OAuth שלכם לחשבון של משתמש אחר.
משימות¶
- היכנסו עם החשבון שלכם
- התחילו תהליך קישור חשבון OAuth
- יירטו את ה-callback URL עם ה-authorization code
- בדקו אם יש הגנת CSRF (state parameter)
- אם אין - שלחו את ה-callback URL לקורבן (שמחובר לאפליקציה)
- החשבון שלכם אמור להתקשר לחשבון הקורבן
תרגיל 7: תרחיש מלא¶
תרחיש¶
אתר מסחר אלקטרוני עם הפונקציות הבאות:
- הרשמה והתחברות
- שכחתי סיסמה
- שינוי פרטי פרופיל (מייל, סיסמה)
- Social Login (Google)
משימות¶
בצעו בדיקת אבטחה מלאה לכל מנגנוני האותנטיקציה:
- מפו את כל נקודות הקצה הקשורות לאותנטיקציה
- בדקו כל מנגנון:
- הרשמה: race conditions, אימות מייל
- התחברות: brute force, credential stuffing
- איפוס: host header poisoning, token prediction
- שינוי סיסמה: IDOR, missing old password
- Social Login: CSRF, account linking
- תעדו כל חולשה שמצאתם
דוח¶
הגישו דוח מפורט עם:
- סיכום ממצאים
- שלבי שחזור לכל חולשה
- הוכחת יתכנות (PoC)
- דירוג חומרה
- המלצות תיקון