תקיפת GraphQL - תרגיל¶
תרגיל 1 - גילוי הסכמה עם Introspection¶
PortSwigger Lab: Accessing private GraphQL posts
משימות¶
- מצאו את ה-endpoint של GraphQL באפליקציה
- שלחו שאילתת introspection מלאה:
{
__schema {
queryType { name }
mutationType { name }
types {
name
kind
fields {
name
type { name kind }
args { name type { name } }
}
}
}
}
- נתחו את הסכמה ומצאו שדות רגישים
- בנו שאילתה שמחלצת את המידע הרגיש
- השלימו את המעבדה
תרגיל 2 - עקיפת Introspection חסומה¶
PortSwigger Lab: Finding a hidden GraphQL endpoint
משימות¶
- גלו שה-endpoint של GraphQL קיים אבל introspection חסום
- נסו לעקוף את החסימה:
- שליחה ב-GET במקום POST
- שינוי שם השאילתה
- שימוש ב-
__typeבמקום__schema - השתמשו ב-field suggestions כדי לגלות שדות:
- בנו את הסכמה מתוך ההצעות
- חלצו את המידע הנדרש
תרגיל 3 - עקיפת הגנת Brute Force עם Aliases¶
PortSwigger Lab: Bypassing GraphQL brute force protections
משימות¶
- מצאו את מוטציית ההתחברות ב-GraphQL
- ודאו שיש הגבלת קצב (rate limiting)
- בנו שאילתה עם aliases לעקיפת ההגבלה:
mutation {
attempt0: login(input: {username: "carlos", password: "123456"}) { token }
attempt1: login(input: {username: "carlos", password: "password"}) { token }
attempt2: login(input: {username: "carlos", password: "admin"}) { token }
}
- כתבו סקריפט שמייצר את השאילתה מקובץ סיסמאות
- מצאו את הסיסמה הנכונה והתחברו
תרגיל 4 - IDOR ב-GraphQL¶
משימות¶
- התחברו לאפליקציה ובצעו שאילתה לפרופיל שלכם
- שנו את ה-ID בשאילתה כדי לגשת לפרופילים אחרים:
query {
user(id: 1) { username email role }
user(id: 2) { username email role }
user(id: 3) { username email role }
}
- מצאו משתמש admin
- בדקו האם יש מוטציות שמאפשרות לשנות את הפרופיל שלכם
- נסו לשנות את ה-role שלכם ל-admin
תרגיל 5 - הזרקה דרך GraphQL¶
משימות¶
- בסביבה מקומית, הקימו שרת GraphQL עם resolver פגיע:
const resolvers = {
Query: {
searchUsers: async (_, { term }) => {
// פגיע ל-SQL Injection!
const query = `SELECT * FROM users WHERE name LIKE '%${term}%'`;
return await db.query(query);
}
}
};
- בנו שאילתת GraphQL שמכילה SQLi ב-variable:
- חלצו את טבלת המשתמשים
תרגיל 6 - כל מעבדות PortSwigger¶
השלימו את כל המעבדות של PortSwigger בנושא GraphQL:
- Accessing private GraphQL posts (Practitioner)
- Accidental exposure of private GraphQL fields (Practitioner)
- Finding a hidden GraphQL endpoint (Practitioner)
- Bypassing GraphQL brute force protections (Practitioner)
לכל מעבדה תעדו¶
- את ה-endpoint שמצאתם
- את הסכמה שגיליתם
- את השאילתות שבניתם
- את התוצאה הסופית
תרגיל 7 - שימוש בכלים¶
משימות¶
- התקינו את InQL ב-Burp Suite והשתמשו בו לסריקת API של GraphQL
- השתמשו ב-GraphQL Voyager לויזואליזציה של הסכמה
- הריצו את graphql-cop על יעד תרגול:
- תעדו את הממצאים מכל כלי
- השוו בין הכלים - מה כל כלי מצא שהאחרים פספסו?
אתגר מסכם¶
תרחיש¶
מצאתם אפליקציה עם GraphQL API. בצעו את הפעולות הבאות:
- גלו את ה-endpoint של GraphQL (נסו
/graphql,/api/graphql,/graphql/v1) - בצעו introspection (או עקפו אם חסום)
- מפו את כל הסכמה - סוגים, שדות, מוטציות
- מצאו ונצלו IDOR
- מצאו ונצלו עקיפת הרשאות
- נסו batching attack
- בדקו האם יש הגבלת עומק לשאילתות
- כתבו דוח מסכם עם כל הממצאים