GraphQL Security Testing
GraphQL security testing by OSCP-certified engineers: schema abuse, broken authorization, IDOR and query DoS. Manual, fixed price, free 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.
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.
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.
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.
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?
How long does a GraphQL penetration testing engagement take?
Do you test both queries and mutations?
What if introspection is already disabled?
Can a GraphQL API be taken down with one request?
What do I get at the end?
Will this satisfy our compliance requirements?
Is the engagement confidential?
Related services
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.
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.
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.
Tell us what you're running
Scoping is free. We reply within one business day, and under 30 minutes for active incidents.