Resumen

Durante una auditoria de seguridad sobre una aplicacion web corporativa, se descubrio un XSS almacenado en el campo "nombre de organizacion" del perfil de usuario. Este campo se renderizaba sin sanitizacion en el panel de administracion cuando un administrador revisaba los perfiles de usuarios registrados.

Simultaneamente, se identifico que el endpoint de cambio de email (/api/account/update-email) no implementaba proteccion CSRF. La combinacion de ambas vulnerabilidades permitia una cadena de ataque que llevaba al account takeover de cuentas con privilegios de administrador.

Detalles tecnicos

Paso 1: XSS almacenado en campo de perfil

El campo "nombre de organizacion" aceptaba caracteres especiales y el valor se insertaba en el DOM del panel de administracion sin escapar:

Payload XSS almacenado
PUT /api/profile HTTP/1.1
Content-Type: application/json

{
  "organization": "<img src=x onerror=eval(atob('BASE64_PAYLOAD'))>"
}

Cuando un administrador accedia al listado de usuarios en /admin/users, el payload se ejecutaba en su contexto de sesion.

Paso 2: CSRF en cambio de email

El endpoint de actualizacion de email no validaba ningun token CSRF ni comprobaba la cabecera Origin:

Request sin proteccion CSRF
POST /api/account/update-email HTTP/1.1
Content-Type: application/json
Cookie: session=[ADMIN_SESSION]

{
  "new_email": "attacker@evil.com"
}

→ 200 OK — Email actualizado sin verificacion adicional

Paso 3: Cadena de ataque completa

El payload XSS ejecutaba un script que:

  1. Realizaba una peticion fetch() al endpoint de cambio de email con las cookies del admin
  2. Cambiaba el email del administrador por uno controlado por el atacante
  3. Solicitaba un reset de password al nuevo email
  4. El atacante obtenia acceso completo a la cuenta de administrador
Flujo del ataque
1. Atacante registra cuenta con organizacion = [XSS payload]
2. Admin visita /admin/users → XSS se ejecuta en su contexto
3. Script cambia el email del admin via /api/account/update-email
4. Atacante solicita password reset al email controlado
5. Account takeover completo del administrador

Impacto

  • Account takeover de cualquier cuenta de administrador
  • Acceso al panel de administracion con todos los datos de la plataforma
  • Modificacion de datos de otros usuarios desde el panel admin
  • Posible escalada a otros sistemas internos accesibles desde el panel

Remediacion

  1. Sanitizar todo input del usuario — Escapar o eliminar caracteres HTML en campos de perfil antes de renderizarlos. Usar Content Security Policy.
  2. Implementar tokens CSRF — Todos los endpoints que modifican estado deben validar un token anti-CSRF.
  3. Requerir confirmacion para cambios criticos — El cambio de email debe requerir la password actual y confirmacion por email.
  4. Cabeceras de seguridad — Implementar X-Content-Type-Options, X-Frame-Options y CSP estricta.