Clickjacking

🌐 Vulnerabilidad: Clickjacking


🕵️‍♂️ ¿Qué es el Clickjacking?

Clickjacking, o secuestro de clics, es un ataque en el que un atacante engaña al usuario para que haga clic en un elemento de una página web (como un botón, enlace o formulario) sin que lo note, ejecutando acciones no deseadas. Esto se logra superponiendo contenido legítimo dentro de un iframe transparente o manipulando su presentación visual.


⚙️ ¿Cómo se produce?

  1. El atacante crea un sitio malicioso:

    • Inserta la página web legítima de la víctima en un iframe.

  2. Manipula el diseño:

    • Usa CSS para hacer transparente el iframe o lo posiciona sobre contenido engañoso.

  3. Engaña al usuario:

    • El usuario cree que está interactuando con el contenido del atacante, pero en realidad está haciendo clic en elementos ocultos de la página legítima.


🛠️ Mecanismo de ataque

  1. Código de ataque con iframe:

    <style>
        iframe {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            opacity: 0; /* Hace el iframe transparente */
            z-index: 999;
        }
    </style>
    <div>
        ¡Haz clic aquí para reclamar tu premio!
        <iframe src="http://victim.com/transfer-money"></iframe>
    </div>
  2. El usuario hace clic pensando que está interactuando con el mensaje del atacante:

    • El clic activa el botón "Transferir dinero" o similar en el sitio legítimo.


🎯 Impacto

  • Transferencias no autorizadas: El atacante podría iniciar pagos o transferencias sin el conocimiento del usuario.

  • Cambio de configuraciones críticas: Modificar la contraseña, el correo o configuraciones de seguridad.

  • Autorizar acciones sensibles: Como aprobar permisos o autenticaciones adicionales.

  • Pérdida de confianza: Los usuarios pueden perder confianza en el sitio legítimo al ser víctimas de este ataque.


📉 Puntaje CVSS v3

  • Vector de ataque: Red

  • Complejidad del ataque: Media

  • Impacto en confidencialidad: Medio

  • Impacto en integridad: Alto

  • Impacto en disponibilidad: Bajo

  • Puntaje CVSS v3: 6.0 - 8.0 (Medio - Alto) ⚠️


🧑‍💻 Ejemplo práctico

Escenario: Un sitio bancario legítimo permite transferencias con un clic en:

<button onclick="transferMoney()">Transferir</button>

Ataque con Clickjacking: El atacante inserta este botón dentro de un iframe en un sitio malicioso con texto engañoso:

<div>
    ¡Reclama tu recompensa ahora!
    <iframe src="http://victim-bank.com/transfer" style="opacity:0; width:100%; height:100%;"></iframe>
</div>

📌 Resultado: El usuario hace clic en el botón de transferencia sin saberlo.


🛡️ ¿Cómo prevenir el Clickjacking?

1️⃣ X-Frame-Options

Configura el encabezado HTTP X-Frame-Options para evitar que tu sitio se cargue dentro de un iframe.

  • SAMEORIGIN: Solo permite cargar el sitio en iframes desde el mismo dominio.

  • DENY: Prohíbe completamente cargar el sitio en iframes.

Ejemplo en Apache:

Header set X-Frame-Options "DENY"

Ejemplo en Nginx:

add_header X-Frame-Options "SAMEORIGIN";

2️⃣ Content Security Policy (CSP)

Usa el encabezado Content-Security-Policy con la directiva frame-ancestors para restringir los dominios permitidos.

Ejemplo:

Content-Security-Policy: frame-ancestors 'self';

3️⃣ Frame Busting Scripts

Implementa un script para evitar que tu sitio se cargue en iframes:

if (window.top !== window.self) {
    window.top.location = window.self.location;
}

⚠️ Nota: No es completamente efectivo en navegadores modernos.

4️⃣ Diseño de doble confirmación

Para acciones críticas, implementa un paso adicional de confirmación, como un diálogo emergente.

5️⃣ Auditorías y pruebas de seguridad

Verifica regularmente tu sitio web contra vulnerabilidades de Clickjacking utilizando herramientas como OWASP ZAP.


💡 Dato extra: Las protecciones como X-Frame-Options y CSP no solo previenen Clickjacking, sino que también ayudan a mitigar otros ataques relacionados con iframes, como el UI Redressing.

🚨 Nota importante: Algunas aplicaciones modernas requieren el uso legítimo de iframes (como widgets de terceros). En estos casos, usa configuraciones específicas con frame-ancestors.

Última actualización

¿Te fue útil?