Pentest de APIs REST y GraphQL: Checklist Tecnico para Bug Bounty Legal
Metodologia tecnica para auditar APIs REST y GraphQL en programas autorizados, con foco en IDOR, bypass de autenticacion e introspeccion maliciosa.
Las APIs se convirtieron en el punto mas lucrativo de cualquier programa de bug bounty serio, y tambien el mas descuidado por pentesters que siguen obsesionados con XSS en el formulario de contacto. Un IDOR en /api/v3/users/{id}/invoices puede pagar entre tres y ocho mil dolares en HackerOne, mientras que un XSS reflejado en una pagina de marketing cierra en 250. El equipo Basilisk OffSec compilo en este checklist el flujo exacto que usamos en engagements autorizados y en programas publicos como GitLab, Shopify y Reddit. Antes de cualquier cosa: lee el alcance, confirma el brand domain y nunca toques endpoints fuera de la lista. Todo aqui presupone autorizacion escrita.
El punto de partida nunca es Burp abierto en la cara. Es el mapeo de superficie. Toma la app movil con apktool, extrae strings de URL y cargalas en Burp como sitemap manual. Usa ffuf con la wordlist api-endpoints-res.txt de SecLists contra paths como /api/, /v1/, /internal/, /graphql, /gql, /query. Wayback Machine via gau y waybackurls revela endpoints obsoletos que nadie parcheo. En un engagement reciente encontramos un /api/v1/admin/export heredado de 2019 que aceptaba token de usuario comun, similar a lo que describimos en Pentest Web desde Cero: Montando un Lab Seguro con DVWA, Juice Shop y Burp Suite. Documenta cada endpoint con metodo, content-type esperado y rol necesario antes de probar payloads.
IDOR sigue siendo el bug numero uno en APIs REST por una razon simple: los devs confian en el ID del JWT pero leen el ID de la URL. Crea dos cuentas en la app objetivo, captura ambas sesiones en Burp y usa la extension Autorize o Auth Analyzer para reenviar cada request de la cuenta A con la cookie de la cuenta B. Presta atencion a respuestas 200 con cuerpo distinto, no solo a status codes. UUIDs no son proteccion: enumeralos via busqueda, exports CSV o notificaciones. La logica de inyeccion tambien aplica en APIs, como mostramos en SQL Injection en la Practica: Explotar, Detectar y Mitigar en Lab Controlado, sobre todo en filtros sort, order y search que terminan en concat SQL.
GraphQL cambia el juego. Empieza probando introspeccion en /graphql con la query {__schema{types{name fields{name}}}}. Si esta abierta en produccion, ya tienes media bounty escrita. Herramientas como InQL, GraphQL Voyager y clairvoyance reconstruyen schemas incluso con introspeccion deshabilitada via field stuffing. Busca mutations expuestas como adminUpdateUser, impersonate, exportAllData. Las batch queries permiten bypass de rate limit: envia 1000 mutations login en una sola request HTTP. El alias overloading rompe validadores ingenuos. A diferencia de lo cubierto en XSS Moderno: DOM, Stored y Reflected con Ejemplos Reales en Entorno de Pruebas, aqui el impacto es casi siempre logico, no inyeccion de script.
El bypass de autenticacion en este contexto va mas alla del clasico none algorithm en JWT. Prueba jku y kid injection, cambio de RS256 a HS256 usando la publica como secreto, y refresh tokens que nunca expiran. Headers como X-Original-URL, X-Rewrite-URL, X-Forwarded-For y X-User-Id suelen bypassar middlewares de auth cuando la API esta detras de un gateway mal configurado. En GraphQL verifica que la directive @auth cubra todos los campos o si algun resolver anidado filtra datos sin chequeo. SSRF tambien aparece en APIs que aceptan URL como parametro para webhooks o avatares, patron que detallamos en SSRF sin Complicaciones: Explotando Cloud Metadata en Lab AWS Local con exploits contra IMDS de AWS.
Rate limiting, mass assignment y business logic cierran el checklist. Para mass assignment agrega campos como isAdmin:true, role:owner, verified:true en cualquier PATCH o PUT. Frameworks como Rails y NestJS con whitelist incompleta sirven admin en bandeja. Para race conditions en endpoints de cupon o retiro, usa Turbo Intruder con single packet attack de James Kettle, mandando 30 requests simultaneas. Documenta impacto con numero de registros expuestos, valor financiero estimado y PoC reproducible en curl. Los programas pagan por impacto demostrado, no por tecnica.
Takeaway practico: arma una plantilla de reporte con titulo CWE, pasos numerados, request crudo, response truncada y sugerencia de fix en una linea. Envia temprano, antes de los duplicados, pero nunca sin confirmar alcance. Bug bounty legal es disciplina antes que creatividad, y en esa disciplina Basilisk construye reputacion en programas como Mercado Libre y Nubank.