Loading audit data...
Volver a casos reales
CASO VERIFICADO // SECTOR FINTECH

Auditoría de
Plataforma de Pagos.

Una inyección SQL crítica en el flujo de transacciones llevaba 18 meses activa sin ser detectada por ningún scanner automatizado. Permitía eludir la verificación 2FA en pagos superiores a 10.000€ sin dejar rastro en los logs de auditoría.

Sector Fintech · Pagos online
Tamaño 38 empleados · Madrid
Tipo de auditoría Pentesting Web + API
Duración del proyecto 6 días (entrega 48h)
Tiempo sin detectar 18 meses
Estado actual 100% parcheado
7
Vulnerabilidades críticas
23
Total hallazgos
18m
Meses sin detectar
48h
Entrega del informe
Contexto // 01

El punto de partida.

El cliente operaba una plataforma de pagos B2B con más de 4.200 transacciones mensuales y un volumen anual superior a los 12 millones de euros. Habían realizado escaneos automáticos trimestrales con herramientas comerciales y contaban con un equipo interno de desarrollo de 8 personas.

La auditoría fue solicitada por el CTO tras un requisito de due diligence de un fondo de inversión que exigía un informe de seguridad independiente. El objetivo era obtener el sello verde y cerrar la ronda. Lo que encontramos cambió por completo los plazos.

// CONTEXTO_REGULATORIO

La plataforma procesaba datos de tarjeta bajo esquema PCI DSS SAQ-A-EP. La vulnerabilidad encontrada habría constituido una violación grave de los requisitos 6.4 y 8.3.2, con potencial de sanción de hasta 100.000€/mes y revocación de la capacidad de procesamiento.

Metodología // 02

Cadena de ataque.

Reproducción técnica del vector de explotación documentado durante la auditoría. Todos los ataques fueron realizados en entorno de staging autorizado.

01 Día 1 / 09:14
Reconocimiento de superficie
OSINT pasivo sobre la plataforma: enumeración de subdominios, tecnologías expuestas (Stack: Laravel 8, MySQL 5.7, nginx 1.18), certificados y metadatos de JS. Identificados 3 endpoints de API no documentados en la especificación pública.
OSINT · RECON
02 Día 1 / 14:30
Análisis del flujo de transacciones
Interceptación del tráfico entre frontend y API con Burp Suite. El endpoint /api/v2/transactions/verify recibía el transaction_id directamente concatenado en la query SQL sin sanitizar.
API ANALYSIS
03 Día 2 / 10:05
Explotación: SQL Injection + 2FA bypass
La inyección en el campo transaction_id permitía manipular la condición de validación 2FA. Con un payload de 34 caracteres fue posible aprobar transacciones de cualquier importe sin requerir el segundo factor. La consulta modificada no generaba entrada en el log de auditoría.
CRÍTICO · CVSS 9.8
04 Día 2 / 15:00
Escalada: acceso a datos de otros usuarios
Mediante UNION-based injection fue posible extraer el listado completo de cuentas de usuario, hashes de contraseña (bcrypt) y datos de tarjeta truncados. Se identificó además un IDOR en el endpoint de historial que permitía acceder a transacciones de otros merchants.
CRÍTICO · CVSS 9.1
05 Día 3 / 11:20
Entrega de evidencias y POC
Informe completo con vídeo de proof-of-concept, CVSS scoring para cada hallazgo, plan de remediación priorizado y sesión de debrief de 2 horas con el equipo de desarrollo.
INFORME · POC · DEBRIEF
# Payload original interceptado en Burp Suite (simplificado) POST /api/v2/transactions/verify HTTP/1.1 Content-Type: application/json { "transaction_id": "1337' OR '1'='1' -- -", "amount": 50000, "currency": "EUR" } # SQL query resultante en el servidor (sin sanitizar): SELECT * FROM transactions WHERE id = '1337' OR '1'='1' -- -' AND two_fa_verified = 1 -- El OR fuerza la condición a TRUE → 2FA bypassado
Hallazgos // 03

Los 23 hallazgos.

Ref. Vulnerabilidad Vector CVSS Estado
CVE-FT-01SQL Injection en /api/v2/transactions/verifyAPI · Backend9.8PARCHEADO
CVE-FT-02IDOR en historial de transacciones de merchantsAPI · IDOR9.1PARCHEADO
CVE-FT-03Bypass de 2FA en pagos de alto importeAuth · Lógica9.0PARCHEADO
CVE-FT-04Exposición de stack trace en errores 500Info Leakage7.5PARCHEADO
CVE-FT-05Tokens de sesión sin expiración (JWT)Auth · Sesiones7.2PARCHEADO
CVE-FT-06CSRF en formulario de modificación de IBANCSRF7.1PARCHEADO
CVE-FT-07Rate limiting ausente en login (fuerza bruta)Auth · Brute Force9.0PARCHEADO
CVE-FT-08CSP ausente — XSS almacenado en panel adminXSS · Headers6.8PARCHEADO
CVE-FT-09 … 2315 hallazgos adicionales (medio/bajo)Varios≤ 5.9PARCHEADOS
Remediación // 04

Plan de acción.

P1 · INMEDIATO
Prepared statements en todas las queries SQL. Migración completa del ORM a consultas parametrizadas. Eliminación de concatenación directa en 14 endpoints críticos.
48h
P1 · INMEDIATO
Validación de autorización por objeto en cada endpoint de API. Implementar verificación de propiedad antes de cualquier lectura/escritura de recurso (IDOR fix).
48h
P1 · INMEDIATO
Re-arquitectura del flujo 2FA. La validación del factor debe ser server-side antes de procesar la transacción, sin posibilidad de manipulación desde el cliente.
72h
P2 · 1 SEMANA
Rotación de todos los tokens JWT activos e implementación de expiración de 15 minutos con refresh token seguro. Invalidación en logout.
5 días
P2 · 1 SEMANA
Rate limiting y CAPTCHA en endpoints de autenticación. Bloqueo temporal tras 5 intentos fallidos con notificación al usuario.
5 días
P3 · 1 MES
Implementación de CSP estricto + cabeceras de seguridad completas (HSTS, X-Frame-Options, Referrer-Policy). Pipeline de CI/CD con análisis SAST en cada deploy.
3 semanas
Resultado // 05

Antes y después.

// ANTES DE LA AUDITORÍA
  • SQL injection sin detectar durante 18 meses
  • 2FA bypassable en pagos de alto importe
  • 7 vulnerabilidades críticas CVSS 9.0+
  • Sin rate limiting en autenticación
  • Tokens JWT sin expiración
  • Stack traces expuestos en producción
  • Sin cabeceras de seguridad HTTP
// 30 DÍAS DESPUÉS
  • Prepared statements en el 100% de queries
  • 2FA server-side inamovible por el cliente
  • 23 vulnerabilidades cerradas y verificadas
  • Rate limiting + lockout en login
  • JWT con expiración 15min + refresh token
  • Páginas de error genéricas en producción
  • Cabeceras completas + CSP estricto
// RESULTADO_FINAL

El cliente cerró la ronda de inversión sin observaciones de seguridad. El re-test post-remediación confirmó el cierre del 100% de los hallazgos. El equipo de desarrollo implementó un pipeline de SAST que ahora analiza cada commit antes del merge a producción.

"

Encontraron una inyección SQL crítica en nuestro flujo de pagos que llevaba activa 18 meses expuesta. El informe priorizaba por impacto real — nuestro equipo parcheó los 3 fallos críticos en 48 horas. Los scanners automáticos que usábamos no detectaron ninguno. El debrief con el equipo de desarrollo valió tanto como el propio informe.

CTO
Director de Tecnología
// FINTECH · MADRID · 38 empleados
¿Tu plataforma tiene el mismo riesgo?

Los scanners automáticos no detectaron este fallo durante 18 meses. Una auditoría manual lo encontró en 48 horas. Solicita la tuya ahora.