1. Extracción de Hallazgos de Auditoría
auditItems| # | Hallazgo | Severidad | Confianza | Host | URL / Endpoint |
|---|---|---|---|---|---|
| F-001 | SQL Injection | High | Certain | api.fintechpro.es | /v2/transactions/search?q= |
| F-002 | Reflected XSS | High | Certain | app.fintechpro.es | /dashboard/report?name= |
| F-003 | Insecure Direct Object Reference (IDOR) | High | Firm | api.fintechpro.es | /v2/invoices/{id} |
| F-004 | Broken Object Level Authorization | High | Firm | api.fintechpro.es | /v2/accounts/{account_id}/statements |
| F-005 | JWT Algorithm Confusion (none) | High | Certain | api.fintechpro.es | /auth/refresh |
| F-006 | Missing Content-Security-Policy | Medium | Certain | app.fintechpro.es | /* (all pages) |
| F-007 | Missing HSTS Header | Medium | Certain | app.fintechpro.es | /* (all pages) |
| F-008 | Overly Permissive CORS Policy | Medium | Firm | api.fintechpro.es | /v2/* (Access-Control-Allow-Origin: *) |
| F-009 | Verbose Error Messages (Stack Trace) | Medium | Certain | api.fintechpro.es | /v2/payments/process |
| F-010 | Session Token in URL Parameters | Medium | Certain | app.fintechpro.es | /export/csv?token=eyJhbGc... |
| F-011 | Unencrypted Sensitive Data in Logs | Medium | Tentative | admin.fintechpro.es | /logs/stream |
| F-012 | Missing X-Frame-Options | Low | Certain | app.fintechpro.es | /* (all pages) |
2. Análisis de Security Headers
responseHeader regexHeaders de Seguridad — Ausentes
CORS / Auth Headers — Problemáticos
3. Endpoints API con Autenticación Débil
proxyHistory.request.headers + jq filter{ "method": "GET", "url": "https://api.fintechpro.es/v2/health", "note": "esperado sin auth" },
{ "method": "GET", "url": "https://api.fintechpro.es/v2/public/rates", "note": "público, ok" },
{ "method": "GET", "url": "https://api.fintechpro.es/v2/invoices/export", "note": ⚠ INVESTIG — devuelve 200 sin Bearer },
{ "method": "POST", "url": "https://api.fintechpro.es/v2/webhooks/trigger", "note": ⚠ ALTO RIESGO — no requiere auth },
{ "method": "DELETE", "url": "https://api.fintechpro.es/v2/accounts/{id}/sessions", "note": ⚠ ALTO RIESGO — session purge sin auth }
]
4. Búsqueda de Secrets / PII en Cuerpos de Respuesta
responseBody — truncado obligatorio 1000 chars{ "url": "https://api.fintechpro.es/v2/config/client",
"status": 200,
"body": "{\"app_version\":\"2.4.1\",\"stripe_publishable\":\"pk_live_51ABC...\",\"STRIPE_SECRET_KEY\":\"sk_live_51ABCDEFGhijklmnopqrstuvwx...\",...[TRUNCATED]" }
{ "url": "https://admin.fintechpro.es/logs/stream?level=debug",
"status": 200,
"body": "[DEBUG] DB_PASSWORD=Ftp2026$Admin! host=postgres-prod.internal port=5432...[TRUNCATED]" }
5. Triaje de Hallazgos — Priorización para Entregable
High + Certain → fix inmediato🔴 [F-005] JWT Algorithm Confusion — alg: none
P1 — Fix InmediatoSeveridad: High · Confianza: Certain · Endpoint: POST /auth/refresh
El servidor acepta tokens JWT con algoritmo "none", permitiendo a un atacante forjar tokens sin firma válida y suplantar cualquier usuario de la plataforma.
HTTP/1.1 200 OK — {"access_token":"...","user":{"role":"admin",...}}
🔴 [BODY-001] Stripe Secret Key expuesta en respuesta de API
P1 — Fix InmediatoSeveridad: Critical (detectada via body search) · Endpoint: GET /v2/config/client
La clave secreta de Stripe (sk_live_*) se devuelve en la respuesta pública del endpoint de configuración del cliente. Cualquier usuario autenticado puede extraerla.
🟡 [F-001] SQL Injection en endpoint de búsqueda de transacciones
P2 — Fix 48hSeveridad: High · Confianza: Certain · Endpoint: GET /v2/transactions/search?q=
Inyección SQL confirmada mediante payload de tiempo (sleep-based). La base de datos subyacente (PostgreSQL) responde con delays de 5s al inyectar '; SELECT pg_sleep(5)--
Time: 5.024s → Confirmed blind time-based SQLi
🔵 [F-006/F-007] Missing Security Headers — CSP + HSTS
P3 — Fix SprintSeveridad: Medium · Confianza: Certain · Scope: Todas las páginas (/*)
La ausencia de Content-Security-Policy facilita ataques XSS persistentes. La ausencia de HSTS permite downgrade attacks a HTTP en los primeros accesos.
Resumen Ejecutivo de Comandos Utilizados
workflow completo| Paso | Filtro Burp CLI | Records | Bytes | Hallazgo clave |
|---|---|---|---|---|
| auditItems (High) | auditItems | jq select(.severity=="High") | 12 | 8.4 KB | SQLi, XSS, IDOR, JWT |
| auditItems (Medium) | auditItems | jq select(.severity=="Medium") | 19 | 12.1 KB | CORS, Headers, Tokens en URL |
| Headers CSP | responseHeader='.*Content-Security-Policy.*' | 0 | 0 B | Header completamente ausente |
| Headers CORS | responseHeader='.*Access-Control-Allow-Origin.*' | 87 | 31.2 KB | 87 endpoints con wildcard (*) |
| Request headers /v2/ | proxyHistory.request.headers | jq filter | 312 | 48.8 KB | 23 endpoints sin Authorization |
| Body — secrets | responseBody='.*(?:api_key|secret|password).*' | 2 | 2.1 KB (truncado) | Stripe sk_live + DB password |
| Body — PAN cards | responseBody='.*[0-9]{4}[\\s-]?[0-9]{4}.*' | 0 | 0 B | No se detectaron PANs en claro |