GraphQL APIs offer flexibility and efficiency — but that same flexibility often introduces security blind spots.

Unlike traditional REST, GraphQL exposes an entire query language to the client — and thus to attackers.

This post walks through a practical GraphQL security testing workflow using Burp Suite + community tools, with a focus on precision, stealth, and clarity.


1. Reconnaissance: Is It GraphQL?

Look for signs like:

  • Endpoints like /graphql, /api/graphql, /gql
  • Content-Type: application/json
  • POST requests with query fields in body

Example:

{
  "query": "{ __typename }"
}

A successful response with HTTP 200 and a "data" field confirms GraphQL is live.


2. Introspection Enabled?

Send the classic introspection query:

{
  "query": "{ __schema { types { name } } }"
}

If enabled, it reveals the full schema — including queries, mutations, and types.

You can also use tools like:

python3 graphql-introspection.py -u https://target.com/graphql

Or Burp extension: GraphQL Raider


3. Use Burp GraphQL Raider Extension

Install via:

Burp → BApp Store → GraphQL Raider

Capabilities:

  • Visual query builder
  • Introspection analysis
  • Auto fuzzing
  • Token replacement

Send any GraphQL POST to Repeater → "Send to GraphQL Raider"


4. Attack Vectors

Now that you understand the schema, focus on key attack classes:

① Excessive Data Exposure

query {
  users {
    id
    email
    passwordHash
  }
}

② Broken Access Control

Try sending the same query as a different role or unauthenticated.

Check if sensitive objects are still returned.

③ Injection Attacks

While SQL injection is rare in well-configured resolvers, try:

query {
  search(term: "\" OR \"1\"=\"1")
}

Also test for:

  • NoSQLi (Mongo-style payloads)
  • SSTI (in template-powered GraphQL backends)

④ Denial of Service (DoS)

Use deeply nested recursive queries:

query {
  a { a { a { a { a { a } } } } }
}

Some servers crash or timeout.


5. Automated Scanning (Optional)

GraphQL endpoints can be integrated into active scanning tools, but be cautious with rate-limiting and introspection-heavy payloads.

Recommended:

  • Manual + Raider for schema-aware fuzzing
  • Intruder for token/session tests
  • Passive detection of disclosure/misconfig

6. Defensive Tips (Bonus)

If you're defending a GraphQL API:

  • Disable introspection in production
  • Apply query depth and complexity limiting
  • Enforce RBAC on fields, not just endpoints
  • Log and rate-limit abusive patterns

Final Notes

GraphQL flips the security model: the client controls the query shape.

This demands fine-grained testing, schema awareness, and thoughtful payload design.

In upcoming posts:

  • Bypassing depth limits
  • Field-level access control fuzzing
  • Using GraphQL Voyager for visualization and mapping

Understand the graph. Map the logic. Exploit the edges.