EYM-PT-2026-000 · Ejemplo

Así se ve lo que entregamos.

Un informe completo de pentest web y API sobre una empresa inventada, Tienda Demo S. A. Es el mismo formato que recibe un cliente: resumen para la gerencia, detalle técnico por hallazgo y anexo de retest.

Descargar PDF Ejemplo · datos ficticios
Todo en esta página es ficticio.

“Tienda Demo S. A.”, sus sistemas, personas, dominios, credenciales y hallazgos son inventados. Los dominios usan el sufijo reservado .example. No describe a ningún cliente real.

01PortadaEjemplo

Ficha del documento

ClienteTienda Demo S. A. (ficticio)
Sistema evaluadoTienda en línea en Next.js y API de comercio en NestJS
Tipo de servicioPentest web y API, caja gris
ReferenciaEYM-PT-2026-000
Ventana de pruebas5 al 16 de octubre de 2026
Retest6 de noviembre de 2026
ClasificaciónConfidencial. Uso exclusivo del cliente
021. Resumen ejecutivoEjemplo

Riesgo general: alto

Un atacante sin relación con la empresa, con solo crear una cuenta gratuita, podía convertirse en administrador de la tienda.

Con ese acceso podía ver y modificar los pedidos y los datos personales de todos los clientes, cambiar precios y desactivar productos. Además, cualquier cliente registrado podía ver los pedidos de otros clientes, incluidos nombre, dirección y teléfono.

La buena noticia: las dos fallas más graves tienen correcciones acotadas, de horas a pocos días de trabajo. En el retest, 5 de los 7 hallazgos estaban corregidos, incluidos los dos más graves.

1.2 · Hallazgos por severidad

Critical1
High2
Medium3
Low1
Info0
Total7
032. Alcance y hallazgosEjemplo

Siete hallazgos en tres activos

Tienda web, API REST de 46 endpoints documentados y panel administrativo, en staging. Dos cuentas de cliente y una de operador. Fuera de alcance: pasarela de pagos, correo, infraestructura del proveedor de nube, denegación de servicio e ingeniería social.

Metodología: OWASP WSTG v4.2, ASVS 5.0 nivel 2, API Security Top 10 (2023) y CVSS 4.0.

1.3 · Resumen de hallazgos
IDHallazgoSeveridadCVSS 4.0Esfuerzo
EYM-01Tokens JWT firmados con secreto débil y sin expiraciónCritical9.3Bajo
EYM-02Acceso a pedidos de otros clientes (IDOR / BOLA)High8.6Bajo
EYM-03CORS refleja cualquier origen y permite credencialesHigh7.1Bajo
EYM-04Clave administrativa del buscador expuesta en el JavaScript públicoMedium6.9Bajo
EYM-05Sin límite de intentos en el inicio de sesiónMedium6.9Bajo
EYM-06Enumeración de usuarios en inicio de sesión y recuperaciónMedium6.9Bajo
EYM-07Cabeceras de seguridad HTTP ausentesLow2.1Bajo
043. Hallazgo detalladoEjemplo · evidencia simulada

EYM-01. Tokens JWT firmados con secreto débil y sin expiración

EYM-01Ejemplo
Critical
CVSS 4.0
9.3
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N
Categoría
API2:2023 · WSTG-SESS-10
CWE
CWE-1391, CWE-613
Estado
Corregido en retest

Descripción

La API emite tokens JWT firmados con HS256 usando un secreto corto y presente en diccionarios públicos de contraseñas. Con un token propio, obtenido al registrar una cuenta gratuita, el secreto se recuperó por fuerza bruta fuera de línea. Conociendo el secreto, es posible firmar tokens con cualquier rol, incluido admin, que la API acepta. Además, los tokens no incluyen exp: un token filtrado sigue siendo válido indefinidamente.

Impacto de negocio

Cualquier persona en internet puede obtener control administrativo total de la tienda. Es una brecha de datos personales con obligación de notificación según la LOPDP y un riesgo directo de fraude.

Evidencia (simulada) · token decodificado, sin campo exp

{ "alg": "HS256", "typ": "JWT" }
{ "sub": "usr_8f2c1a", "email": "cliente.a@tienda.example", "role": "customer", "iat": 1791100800 }

Recomendación

Migrar a firma asimétrica (ES256) con la clave privada en un gestor de secretos, expiración de 15 minutos con renovación revocable, aceptar solo el algoritmo esperado e invalidar todos los tokens anteriores.

// auth.module.ts (NestJS)
JwtModule.registerAsync({
  inject: [ConfigService],
  useFactory: (cfg: ConfigService) => ({
    privateKey: cfg.getOrThrow('JWT_PRIVATE_KEY'), // desde el gestor de secretos
    publicKey: cfg.getOrThrow('JWT_PUBLIC_KEY'),
    signOptions: { algorithm: 'ES256', expiresIn: '15m' },
    verifyOptions: { algorithms: ['ES256'] },
  }),
});
054. Plan de remediaciónExtracto

Qué corregir primero, quién y en cuánto tiempo

PrioridadIDAcciónResponsableEsfuerzoPlazo
1EYM-01Nuevo secreto o firma ES256, expiración de 15 min, renovación revocableBackend1 – 2 días72 horas
2EYM-02Filtro por propietario en pedidos, direcciones y facturas; pruebas de autorizaciónBackend1 día7 días
3EYM-03Lista explícita de orígenes CORS; revisar SameSiteBackend2 horas7 días
4EYM-04Rotar clave; clave de solo búsqueda en el navegadorFrontend4 horas7 días

Extracto: el informe completo incluye los siete hallazgos y una acción transversal (escaneo de secretos y dependencias en CI, pruebas de autorización por rol).

06Anexo A. Retest6 de noviembre de 2026

Riesgo después del retest: bajo

El retest verifica cada hallazgo después de la corrección. Cinco corregidos, uno parcialmente (falta el límite por cuenta además del límite por IP) y uno con riesgo aceptado temporalmente por el cliente.

Estado posterior al retest
IDHallazgoSeveridadCVSS 4.0Retest
EYM-01Tokens JWT firmados con secreto débil y sin expiraciónCritical9.3Corregido
EYM-02Acceso a pedidos de otros clientes (IDOR / BOLA)High8.6Corregido
EYM-03CORS refleja cualquier origen y permite credencialesHigh7.1Corregido
EYM-04Clave administrativa del buscador expuesta en el JavaScript públicoMedium6.9Corregido
EYM-05Sin límite de intentos en el inicio de sesiónMedium6.9Parcial
EYM-06Enumeración de usuarios en inicio de sesión y recuperaciónMedium6.9Corregido
EYM-07Cabeceras de seguridad HTTP ausentesLow2.1Riesgo aceptado

Siguiente paso

¿Quiere un informe así sobre su sistema?

Entendemos su sistema, lo que le preocupa y el plazo, y le decimos si podemos ayudar. La llamada no tiene costo y no compromete a nada.