Home/Services/GraphQL Security Testing
security service

GraphQL Security Testing

GraphQL security testing by OSCP-certified engineers: schema abuse, broken authorization, IDOR and query DoS. Manual, fixed price, free retest.

Manual, expert-ledEvidence-based findingsFree remediation retest

GraphQL security testing checks the one endpoint your whole API funnels through, where a single crafted query can pull data across half your schema, run mutations you never meant to expose, or knock the service over with one deeply nested request. GraphQL moves the risk from the URL to the query, and that is exactly where a scanner stops looking.

What GraphQL security testing actually covers

REST spreads its attack surface across dozens of endpoints, each with its own method and parameters. GraphQL collapses that into a single POST, and the real interface becomes the schema. That changes how authorization has to work, how rate limiting has to work, and how much damage one request can do. Most GraphQL flaws are not exotic. They come from applying REST-era assumptions to a query language that lets the client decide what to fetch.

We test the endpoint the way an attacker who has mapped your schema would: asking for fields the interface never requests, calling mutations the front end never fires, and batching work to slip past the counters that are supposed to slow abuse down.

Introspection exposure and schema enumeration, including field-suggestion leaks when introspection is disabled
Per-field and per-mutation authorization gaps that resolvers forget to check
IDOR through node and object arguments, including batched array inputs
Deeply nested and circular queries causing denial of service
Alias and query batching that bypass rate limits and brute-force protection
Injection reaching resolvers: SQL, NoSQL and SSRF through query arguments
Verbose errors and stack traces leaking schema, internal hosts and versions

The schema is the attack surface

In a GraphQL API the client asks for exactly the fields it wants, so the first thing an attacker does is learn what fields exist. Introspection hands that over directly. When introspection is switched off, many servers still leak field names through “did you mean” suggestions in error messages, which is enough to reconstruct the schema query by query. Knowing the shape of the graph is the difference between guessing and going straight for the sensitive resolver.

One endpoint, many assumptions

Because every operation shares a single endpoint, teams often bolt authorization onto the endpoint rather than the resolver. That works until a query reaches a nested field whose resolver assumed the parent already checked permissions. The result is data you can read through one path even though the obvious path is locked. This is the pattern behind most serious GraphQL findings, and it only surfaces when someone tests each field and mutation individually.

How we run a GraphQL penetration testing engagement

Testing is manual and query-driven, using Burp Suite Professional with GraphQL-aware tooling to build, batch and replay operations. We follow the OWASP API Security Top 10 and OWASP testing guidance, then go beyond it into the query-language behaviour that generic API tests miss. Here is what an engineer does across a GraphQL API security testing project.

Phase 1 — Schema mapping

We recover the schema first, through introspection where it is enabled and through error-message field suggestions where it is not. The output is a full picture of types, queries, mutations and arguments, which is the map every later test works from.

Phase 2 — Authorization testing per field and mutation

With the schema in hand we test access control at the resolver level. We call each sensitive query and mutation as an unauthenticated user, then as a low-privilege user, and check whether the object arguments let one account reach another’s data. Batched array inputs get special attention, because a single request that accepts a list of IDs is a common way to loop an IDOR at speed.

Phase 3 — Abuse of query mechanics

GraphQL gives the client power the server has to defend against. We build deeply nested and circular queries to test complexity and depth limits, and we use aliases and query batching to send many operations in one request. Done right, this bypasses rate limits and turns a login form into an offline-speed brute force against your own server.

Injection through resolvers

Arguments in a GraphQL query end up as parameters in database calls, internal HTTP requests and downstream services. We test them for SQL and NoSQL injection, operator injection, and SSRF where a resolver fetches a URL. The query language is just the delivery mechanism; the vulnerability lives in what the resolver does with the value.

Phase 4 — Reporting and retest

You get a report while the findings are current, with each issue proven by a real query and response. After your team fixes, we retest the same operations for free to confirm the resolver now enforces what it should.

48h
typical time to first critical findings
100%
manually verified queries, no false-positive dumps
Free
retest after you fix

Common GraphQL vulnerabilities we find

The findings cluster in a few places, and they are usually the product of GraphQL being treated like REST. These are the ones we prove repeatedly.

Introspection and field-suggestion leaks

Introspection left on in production hands an attacker the entire schema. Turning it off helps, but if error messages still suggest close field names, the schema can be rebuilt anyway. We report both, and we distinguish a genuine leak from introspection that is public by design on an API meant to be open.

Missing per-mutation authorization

The most damaging pattern we see. A mutation that updates or deletes a record checks that you are logged in but never that the record is yours. Because mutations are how GraphQL writes data, a missing ownership check here is not an information leak, it is an attacker editing other people’s accounts.

IDOR via node and array arguments

Object identifiers passed as arguments let you request a specific record. Where the resolver trusts the identifier without an ownership check, incrementing or swapping it returns another user’s data. Array inputs make it worse by letting one query pull a batch of records that were never yours.

Query-depth and complexity denial of service

Relationships in a graph can be walked in a loop. A query that nests the same relation many levels deep can force the server to resolve an enormous result from a tiny request, exhausting CPU and memory. Without depth and complexity limits, one request is a denial-of-service tool.

Batching to defeat rate limits

Aliases let a single operation contain hundreds of copies of the same query with different arguments. If your throttling counts requests rather than operations, an attacker sends one request and gets hundreds of attempts, which quietly defeats brute-force and enumeration protection.

Get a fixed quote

Want this tested on your own systems?

Free 20-minute scoping call, a fixed price with no hourly surprises, and a free retest once you fix what we find.

Get a fixed quote

What you get

The report speaks to two readers at once. Leadership gets the risk in business terms. Your engineers get everything needed to see and close each issue without guesswork.

  • An executive summary that states what an attacker could read, change or take down through the API.
  • Each finding with a CVSS score, the exact GraphQL query used, the response that proves it, and the impact.
  • Concrete remediation for your stack, whether that means resolver-level authorization, depth and complexity limits, query cost analysis, or disabling introspection.
  • A free retest after deployment, and an attestation letter for customers, partners or auditors.

We write reproduction steps as copy-ready queries, so a developer who was not in the room can run them against a staging endpoint and watch the bug happen.

Compliance and standards

A GraphQL assessment maps cleanly onto the frameworks European businesses report against. It is anchored in the OWASP API Security Top 10, supports ISO 27001 Annex A secure-development and testing controls, and satisfies the application-layer penetration testing PCI DSS 4.0 asks for under requirement 11.4 wherever the API touches payment data.

SOC 2, GDPR and DORA

For SOC 2, testing the API evidences that the controls over customer data are exercised, not assumed. Under GDPR, a broken-authorization query that returns another customer’s records is a reportable exposure, so proving those paths are closed is part of demonstrating appropriate technical measures. Financial-sector clients can fold GraphQL testing into their DORA threat-led testing scope.

Why manual testing beats a scanner here

Generic API scanners were built for REST. Point one at a GraphQL endpoint and it sees a single URL that always returns 200, with no idea what fields exist behind it or which mutation is dangerous. It cannot reason that a nested field skipped an ownership check, or that one aliased request is really five hundred brute-force attempts. Those judgments need a person who understands how a graph resolves.

That is the work you are buying. Our engineers hold OSCP and OSWE, and they test the schema by hand, decide which resolver is worth attacking, and recognise a successful exploit even when the response looks like a perfectly ordinary query result.

Pricing

Cost is driven by the size of your schema, how many roles and tenants the API serves, and whether mutations and payment flows are in scope. Here is the shape of a typical European engagement.

Engagement What’s included Timeline Price
Essential Single GraphQL endpoint, one or two roles, schema mapping, authorization and IDOR testing, OWASP API Top 10 coverage, full report, free retest 3–5 working days from €2,500
Standard Business API with several roles, mutations and third-party resolvers, depth/complexity DoS, batching and injection testing, exec + technical report 5–8 working days €3,500–€8,000
Advanced Large schema, multi-tenant isolation, deep auth/SSO, payment mutations, attack-chaining across resolvers and downstream services 8–12 working days €8,000–€20,000
Compliance add-on Mapping and attestation letter for PCI DSS, ISO 27001, SOC 2, GDPR or DORA with any tier from €800
Custom / large estate Multiple APIs or a federated graph across services, scoped to your environment on scoping custom

Every engagement is fixed-price, quoted after a free 20-minute scoping call, so there are no hourly surprises and a retest is always included. Get a fixed quote

FAQ

How much does GraphQL security testing cost?
It starts from €2,500 for a single endpoint with core authorization testing, and scales with the size of your schema and the number of roles and mutations in scope. You get a fixed quote after a free scoping call, with no hourly meter.
How long does a GraphQL penetration testing engagement take?
A typical project runs 5–8 working days plus the report. Critical issues, such as a mutation missing an ownership check, are flagged to you the same day we prove them.
Do you test both queries and mutations?
Yes. Queries are where data leaks and mutations are where data gets changed, so both matter. We test authorization on every sensitive query and every mutation individually, because a per-endpoint check often misses a resolver deep in the graph.
What if introspection is already disabled?
We still map the schema. Many servers leak field names through “did you mean” suggestions in error messages, so the schema can be rebuilt query by query. Disabling introspection helps but is not a complete defence, and we test whether it actually holds.
Can a GraphQL API be taken down with one request?
It can, if depth and complexity limits are missing. A deeply nested or circular query can force the server to resolve a huge result from a tiny request. We test your limits and, where they are absent, we show the impact safely rather than causing an outage.
What do I get at the end?
An executive summary for leadership and a technical report with each finding, its CVSS score, the exact query that triggers it, the proof, and a prioritized fix. A free retest confirms your resolvers now enforce what they should.
Will this satisfy our compliance requirements?
Yes. The report supports the OWASP API Security Top 10, ISO 27001, SOC 2 and PCI DSS 4.0 requirement 11.4 where the API handles payment data. Tell us your framework and we align the deliverables and attestation letter.
Is the engagement confidential?
Every engagement runs under NDA, and the schema, queries and findings are handled securely and shared only with the people you name. As a European provider we hold to strict data-handling practice throughout.

Related services

Who needs this

Teams running a GraphQL API in production: SaaS platforms, mobile back ends, and any product that exposed a graph to speed up front-end development. If your authorization lives at the endpoint rather than the resolver, or you have never tested what one crafted query can pull, this is the assessment that finds out before an attacker does.

why safetybis

Security you can prove

The same standard on every engagement, big or small.

Evidence, not opinions

Every finding ships with a reproduction and proof of concept — no vague "maybe vulnerable".

Humans over scanners

Certified engineers find the logic flaws and chained attacks automated tools walk straight past.

Fixed price, free retest

You know the cost up front, and verifying the fix is part of the deal — not a second invoice.

500+
assessments delivered
<30min
incident first response
12k+
infections removed
98%
fixed within one retest
$ safetybis quote --service "GraphQL Security Testing"

Ready to lock this down?

Free scoping call, fixed price, free retest. Tell us what you're running and we'll take it from there — usually within one business day.

get in touch

Tell us what you're running

Scoping is free. We reply within one business day, and under 30 minutes for active incidents.