🛡️

CULTIVA IA Security

Análisis de Proyecto Burp Suite — CLI Extractor

⚠ Confidencial

FintechPro SaaS S.L. · Auditoría Web 2026-Q2

Generado: 2026-06-15 · Ref: FTP-2026-003

Cliente
FintechPro SaaS S.L.
app.fintechpro.es api.fintechpro.es
Periodo de captura
2026-05-10 → 2026-06-01
~2.400 proxy entries 180 site map items
Herramienta
Burp Suite Pro 2025.5
analizador-proyectos-burpsuite CLI mode
1
Extraer auditItems
Hallazgos automáticos filtrados por severidad
2
Scan headers
CSP, HSTS, X-Frame-Options ausentes
3
Endpoints API
Auth débil, tokens expuestos
4
Body search
Secrets/PII en respuestas (truncado 1000 chars)
5
Informe priorizado
Triaje High+Certain → entregable cliente

1. Extracción de Hallazgos de Auditoría

auditItems
Comando ejecutado (bash)
$ burp-search.sh ~/auditorias/fintechpro-2026-05.burp auditItems \ | jq -c 'select(.severity == "High" or .severity == "Medium")' \ | head -n 50 | head -c 50000
→ 47 hallazgos totales | 12 High | 19 Medium | 16 Low/Info — 34.2 KB
0
Critical
12
High
19
Medium
16
Low / Info
# 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 regex
Comandos ejecutados
# Buscar Content-Security-Policy $ burp-search.sh fintechpro.burp "responseHeader='.*Content-Security-Policy.*'" | head -c 50000 # → 0 registros (header ausente en todas las respuestas) $ burp-search.sh fintechpro.burp "responseHeader='.*Strict-Transport-Security.*'" | head -c 50000 # → 0 registros (HSTS no configurado) $ burp-search.sh fintechpro.burp "responseHeader='.*Access-Control-Allow-Origin.*'" \ | jq -r '.url + " → " + .header' | head -n 30 | head -c 50000 # → 87 endpoints con CORS wildcard (*)

Headers de Seguridad — Ausentes

Content-Security-Policy ✗ AUSENTE (0/2400 respuestas)
Strict-Transport-Security ✗ AUSENTE (0/2400 respuestas)
X-Frame-Options ✗ AUSENTE (0/2400 respuestas)
X-Content-Type-Options ✗ AUSENTE (0/2400 respuestas)
Permissions-Policy ✗ AUSENTE (0/2400 respuestas)

CORS / Auth Headers — Problemáticos

Access-Control-Allow-Origin ⚠ WILDCARD (*) en 87 endpoints
Access-Control-Allow-Credentials ✗ true + wildcard origin (crítico)
Cache-Control ⚠ Ausente en respuestas con PII (38 URLs)
Server ⚠ Nginx/1.24.0 — version disclosure
Referrer-Policy ✓ Presente (strict-origin-when-cross-origin)

3. Endpoints API con Autenticación Débil

proxyHistory.request.headers + jq filter
Comando — buscar endpoints sin Authorization header
$ burp-search.sh fintechpro.burp proxyHistory.request.headers \ | jq -c 'select(.url | test("/api/|/v2/")) | select(.headers | test("Authorization") | not)' \ | jq -r '.method + " " + .url' | sort -u | head -n 50 | head -c 50000
→ 23 líneas | GET/POST a endpoints /v2/ sin Authorization header capturado
"endpoints_sin_auth": [
  { "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
Comando — secrets y datos sensibles (siempre truncado)
# 1. Buscar patrones tipo secret/key/password $ burp-search.sh fintechpro.burp "responseBody='.*(?:api_key|secret|password|token)[\"\':\\s]*[A-Za-z0-9+/]{20,}.*'" \ | head -n 10 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")' # 2. Buscar números de tarjeta PAN (PCI-DSS) $ burp-search.sh fintechpro.burp "responseBody='.*[0-9]{4}[\\s-]?[0-9]{4}[\\s-]?[0-9]{4}[\\s-]?[0-9]{4}.*'" \ | head -n 5 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")' # 3. Buscar emails de usuarios en respuestas $ burp-search.sh fintechpro.burp "responseBody='.*[a-z0-9._%+]+@[a-z0-9.-]+\.[a-z]{2,}.*'" \ | head -n 20 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'
⚠ Regla HARD: todos los campos .body truncados a 1000 caracteres máximo. Contenido completo disponible en Burp Suite UI.
// Resultado: secrets encontrados (2 hits confirmados)
{ "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 Inmediato

Severidad: 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.

eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VySWQiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiJ9.
HTTP/1.1 200 OK — {"access_token":"...","user":{"role":"admin",...}}
Recomendación: Rechazar explícitamente alg=none en la validación de JWT. Fijar whitelist de algoritmos permitidos (RS256/ES256). Rotar todos los tokens activos.

🔴 [BODY-001] Stripe Secret Key expuesta en respuesta de API

P1 — Fix Inmediato

Severidad: 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.

Recomendación: Eliminar inmediatamente sk_live de la respuesta. Revocar y regenerar la clave en Stripe Dashboard. Auditar qué transacciones se realizaron con la clave expuesta.

🟡 [F-001] SQL Injection en endpoint de búsqueda de transacciones

P2 — Fix 48h

Severidad: 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)--

GET /v2/transactions/search?q=%27%3B+SELECT+pg_sleep%285%29--
Time: 5.024s → Confirmed blind time-based SQLi
Recomendación: Usar prepared statements / parametrized queries. Revisar todos los endpoints con parámetros de búsqueda. Escanear logs de acceso previos para detección de explotación.

🔵 [F-006/F-007] Missing Security Headers — CSP + HSTS

P3 — Fix Sprint

Severidad: 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.

Recomendación: Añadir CSP restrictiva (nonce-based) + HSTS (max-age=31536000; includeSubDomains; preload) a nivel de servidor Nginx. Verificar con securityheaders.com.

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