תקיפת JWT - תרגיל¶
תרגיל 1: עקיפת אלגוריתם None¶
רקע¶
קיבלתם גישה לאפליקציה כמשתמש רגיל. לאחר ההתחברות, האפליקציה מנפיקה טוקן JWT. פאנל הניהול נמצא ב-/admin ודורש role: admin בטוקן.
משימות¶
- היכנסו לאפליקציה עם הפרטים
wiener:peter - חלצו את טוקן ה-JWT מתוך ה-cookie או ה-header
- פענחו את הטוקן באמצעות jwt.io וזהו את המבנה
- שנו את ה-
algל-"none"ואת ה-roleל-"admin" - הסירו את החתימה (השאירו נקודה בסוף)
- שלחו את הטוקן המזויף ובדקו אם קיבלתם גישה ל-
/admin
מעבדת PortSwigger¶
בצעו את המעבדה:
JWT authentication bypass via unverified signature
ולאחר מכן:
JWT authentication bypass via flawed signature verification
תרגיל 2: תקיפת בלבול אלגוריתמים - Algorithm Confusion¶
רקע¶
האפליקציה משתמשת ב-RS256 לחתימת טוקנים. המפתח הציבורי חשוף.
משימות¶
- מצאו את המפתח הציבורי של השרת (בדקו את
/.well-known/jwks.jsonאו/jwks.json) - המירו את המפתח מפורמט JWK לפורמט PEM
- שנו את האלגוריתם בטוקן מ-RS256 ל-HS256
- שנו את ה-payload כך שתהיו אדמין
- חתמו על הטוקן עם HS256 תוך שימוש במפתח הציבורי כסוד
- שלחו את הטוקן וגשו לפאנל הניהול
כתבו סקריפט Python שמבצע את כל השלבים¶
# השלימו את הסקריפט
import jwt
import requests
TARGET = "https://TARGET_URL"
def solve():
# שלב 1: התחברות וקבלת טוקן
# ...
# שלב 2: השגת המפתח הציבורי
# ...
# שלב 3: יצירת טוקן עם algorithm confusion
# ...
# שלב 4: גישה לפאנל ניהול
# ...
pass
מעבדת PortSwigger¶
בצעו את המעבדות:
- JWT authentication bypass via algorithm confusion
- JWT authentication bypass via algorithm confusion with no exposed key
תרגיל 3: ניצול פרמטר kid¶
חלק א - מעבר ספריות - Path Traversal¶
- זהו אפליקציה שמשתמשת בפרמטר
kidב-JWT - בדקו אם ניתן לבצע path traversal דרך ה-
kid - הצביעו את ה-
kidעל/dev/nullוחתמו עם מחרוזת ריקה - השיגו גישת אדמין
חלק ב - הזרקת SQL¶
- בדקו אם פרמטר ה-
kidמועבר לשאילתת SQL - השתמשו ב-UNION injection כדי להחליף את מפתח האימות
- כתבו payload שמחזיר ערך ידוע כמפתח
- חתמו את הטוקן עם הערך שהזרקתם
כתבו סקריפט¶
# השלימו את הסקריפט עבור שתי התקיפות
import jwt
def kid_traversal_attack(original_token, target_url):
"""פתרון עבור path traversal"""
# ...
pass
def kid_sqli_attack(original_token, target_url):
"""פתרון עבור SQL injection"""
# ...
pass
מעבדת PortSwigger¶
בצעו את המעבדה:
JWT authentication bypass via kid header path traversal
תרגיל 4: הזרקת JWK ו-JKU¶
חלק א - הזרקת JWK¶
- צרו זוג מפתחות RSA חדש
- הטמיעו את המפתח הציבורי שלכם בתוך ה-header באמצעות פרמטר
jwk - שנו את ה-payload לקבלת הרשאות אדמין
- חתמו את הטוקן עם המפתח הפרטי שלכם
חלק ב - הזרקת JKU¶
- הקימו שרת שמגיש JWK Set (השתמשו ב-Burp Collaborator או ב-exploit server)
- שנו את ה-
jkuב-header להצביע על השרת שלכם - חתמו את הטוקן ובדקו אם השרת מאמת אותו
מעבדת PortSwigger¶
בצעו את המעבדות:
- JWT authentication bypass via jwk header injection
- JWT authentication bypass via jku header injection
תרגיל 5: שרשור JWT עם SSRF¶
תרחיש¶
אפליקציה משתמשת ב-JWT עם פרמטר jku. השרת בודק שה-URL מתחיל ב-https://trusted-server.com, אך קיים open redirect ב-/redirect?url=.
משימות¶
- זהו את בדיקת ה-URL שהשרת מבצע על ה-
jku - מצאו את נקודת ה-open redirect באפליקציה
- שרשרו את ה-open redirect עם ה-
jkuכדי להפנות לשרת שלכם:
- ארחו JWK Set בשרת שלכם
- חתמו טוקן עם הרשאות אדמין
- גשו לפאנל הניהול
שאלות נוספות¶
- מה קורה אם השרת בודק את ה-URL גם ברמת ה-domain? אילו טכניקות עקיפה תנסו?
- האם ניתן לשלב את ה-SSRF כדי לגשת למשאבים פנימיים? תנו דוגמה
- כיצד הייתם מונעים תקיפה זו כמפתחים?
תרגיל 6: שבירת סוד HMAC¶
משימות¶
- קיבלתם טוקן JWT חתום ב-HS256
- השתמשו ב-hashcat לשבירת הסוד:
- לחילופין, השתמשו ב-jwt_tool:
- לאחר שמצאתם את הסוד, צרו טוקן חדש עם הרשאות אדמין
- אילו מילוני סיסמאות הכי יעילים למטרה זו?
תרגיל בונוס: סקריפט סריקה אוטומטי¶
כתבו סקריפט Python מקיף שמקבל טוקן JWT וכתובת יעד, ומבצע את כל הבדיקות הבאות באופן אוטומטי:
- פענוח והדפסת תוכן הטוקן
- בדיקת none algorithm (כל הווריאציות)
- בדיקת kid path traversal
- בדיקת kid SQL injection
- ניסיון שבירת סוד HMAC עם מילון נפוצים
- בדיקת קבלת טוקנים שפג תוקפם
הסקריפט צריך להדפיס דוח מסודר של כל הממצאים.