Pentest APIs REST et GraphQL : Checklist Technique pour Bug Bounty Legal
Methodologie technique pour auditer les APIs REST et GraphQL dans des programmes autorises, centree sur IDOR, contournement d'authentification et introspection.
Les APIs sont devenues la surface la plus lucrative de tout programme de bug bounty serieux, et aussi la plus negligee par les pentesters encore obsedes par le XSS dans les formulaires de contact. Un IDOR sur /api/v3/users/{id}/invoices peut payer entre trois et huit mille dollars sur HackerOne, alors qu'un XSS reflechi sur une page marketing se ferme a 250. L'equipe Basilisk OffSec a compile dans cette checklist le flux exact que nous utilisons en mission autorisee et sur des programmes publics comme GitLab, Shopify et Reddit. Avant toute chose : lis le perimetre, confirme le brand domain, et ne touche jamais a un endpoint hors liste. Tout ici suppose une autorisation ecrite.
Le point de depart n'est jamais Burp ouvert sur la figure. C'est la cartographie de surface. Recupere l'app mobile avec apktool, extrais les chaines d'URL et charge-les dans Burp comme sitemap manuel. Lance ffuf avec la wordlist api-endpoints-res.txt de SecLists contre des paths comme /api/, /v1/, /internal/, /graphql, /gql, /query. Wayback Machine via gau et waybackurls fait remonter des endpoints obsoletes que personne n'a patches. Lors d'une mission recente, nous avons trouve un /api/v1/admin/export herite de 2019 acceptant un token utilisateur classique, similaire a ce que nous decrivons dans Pentest Web depuis Zero: Construire un Lab Sur avec DVWA, Juice Shop et Burp Suite. Documente chaque endpoint avec methode, content-type attendu et role requis avant de lancer le moindre payload.
L'IDOR reste le bug numero un dans les APIs REST pour une raison simple : les devs font confiance a l'ID issu du JWT mais lisent l'ID dans l'URL. Cree deux comptes sur l'app cible, capture les deux sessions dans Burp, et utilise l'extension Autorize ou Auth Analyzer pour rejouer chaque requete du compte A avec le cookie du compte B. Surveille les reponses 200 avec un corps different, pas seulement les codes statut. Les UUIDs ne sont pas une protection : enumere-les via endpoints de recherche, exports CSV ou notifications. La logique d'injection s'applique aussi aux APIs, comme montre dans SQL Injection en Pratique: Exploiter, Detecter et Mitiger dans un Lab Controle, surtout sur les filtres sort, order et search qui finissent en concatenation SQL.
GraphQL change la donne. Commence par tester l'introspection sur /graphql avec la requete {__schema{types{name fields{name}}}}. Si elle est ouverte en production, tu as deja la moitie du rapport ecrite. Des outils comme InQL, GraphQL Voyager et clairvoyance reconstruisent le schema meme avec l'introspection desactivee via field stuffing. Cherche les mutations exposees comme adminUpdateUser, impersonate, exportAllData. Les batch queries contournent le rate limit : envoie 1000 mutations login dans une seule requete HTTP. L'alias overloading casse les validateurs naifs. Contrairement a ce que nous couvrons dans XSS Moderne: DOM, Stored et Reflected avec Exemples Reels en Environnement de Test, ici l'impact est presque toujours logique, pas une injection de script.
Le contournement d'authentification depasse ici le classique none algorithm dans JWT. Teste jku et kid injection, le passage RS256 vers HS256 en utilisant la cle publique comme secret, et les refresh tokens qui n'expirent jamais. Des headers comme X-Original-URL, X-Rewrite-URL, X-Forwarded-For et X-User-Id contournent souvent les middlewares d'auth quand l'API est derriere une gateway mal configuree. En GraphQL, verifie que la directive @auth couvre tous les champs ou si un resolver imbrique fuite des donnees sans controle. Le SSRF apparait aussi dans les APIs qui acceptent une URL en parametre pour webhooks ou avatars, motif detaille dans SSRF Demystifie: Exploiter Cloud Metadata dans un Lab AWS Local avec des exploits contre IMDS d'AWS.
Rate limiting, mass assignment et business logic ferment la checklist. Pour le mass assignment, ajoute des champs comme isAdmin:true, role:owner, verified:true dans n'importe quel PATCH ou PUT. Les frameworks comme Rails et NestJS avec whitelist incomplete servent l'admin sur un plateau. Pour les race conditions sur endpoints de coupon ou retrait, utilise Turbo Intruder avec la single packet attack de James Kettle, en tirant 30 requetes simultanees. Documente l'impact avec le nombre d'enregistrements exposes, la valeur financiere estimee et un PoC curl reproductible. Les programmes paient pour l'impact demontre, pas pour la technique.
Takeaway pratique : construis un template de rapport avec titre CWE, etapes numerotees, requete brute, reponse tronquee et suggestion de correctif en une ligne. Soumets tot, avant les doublons, mais jamais sans confirmer le perimetre. Le bug bounty legal, c'est de la discipline avant la creativite, et c'est sur cette discipline que Basilisk construit sa reputation sur des programmes comme Mercado Livre et Nubank.