the_open_door
café
ESEN
← Volver al índice

Clickjacking

El Clickjacking ("secuestro de clic") engaña a la víctima para que pulse algo distinto de lo que cree. El atacante carga la web legítima dentro de un <iframe> transparente, lo coloca encima de su propio contenido señuelo y alinea un botón sensible (borrar cuenta, aprobar un pago, cambiar un permiso) justo bajo el cursor. La víctima cree que pulsa el señuelo, pero el clic cae en la web real, donde ya está autenticada.

La página del atacante es tan simple como esto:

<style>
  iframe { position:absolute; top:0; left:0; width:100%; height:100%; opacity:0.0; z-index:2; }
  .lure  { position:absolute; top:420px; left:60px; z-index:1; }
</style>
<div class="lure">Haz clic para ganar un premio</div>
<iframe src="https://victima.tld/cuenta/borrar"></iframe>

El opacity:0 hace invisible el iframe y el z-index lo deja por encima del señuelo, así que el clic "atraviesa" al botón real. Variantes: drag-and-drop para robar datos entre marcos, y el cursorjacking (mover el cursor visible respecto al real). Como se apoya en una acción con la sesión ya iniciada, es primo del CSRF pero por interacción del usuario.

Cómo detectarlo. No hay una petición maliciosa que grepear: la señal es defensiva, la ausencia de cabeceras anti-framing. Un sitio que responde sin X-Frame-Options ni Content-Security-Policy: frame-ancestors en páginas con acciones sensibles es vulnerable por definición. Del lado del navegador, los reportes de CSP (report-uri) avisan de intentos de enmarcado desde orígenes ajenos.

Defensa. Enviar X-Frame-Options: DENY (o SAMEORIGIN) y, mejor, Content-Security-Policy: frame-ancestors 'none' (o la lista de orígenes de confianza) en todas las páginas con acciones de estado; marcar las cookies como SameSite=Lax/Strict para que la acción enmarcada no lleve la sesión; y usar confirmaciones que no dependan de un único clic. Se combina con CORS mal configurado y con el secuestro de sesión para encadenar impacto.