SecureBank - Simulador CSRF

Laboratorio interactivo para entender y prevenir ataques Cross-Site Request Forgery (CSRF)

Vista del Usuario Sesión activa
Saldo Disponible
$5,000.00
Realizar transferencia
Historial de transferencias
FechaDestinatarioMontoEstado
Vista del Atacante
¿Qué es CSRF?
CSRF (Cross-Site Request Forgery) es un ataque que engaña al navegador de un usuario para que ejecute acciones no deseadas en una aplicación donde está autenticado.
Solicitud capturada
Esperando transferencia del usuario…
¿Cómo funciona el exploit?
El atacante crea una página HTML maliciosa que contiene un formulario oculto que replica la solicitud de transferencia. Cuando la víctima visita esa página, el navegador envía la solicitud automáticamente.
PoC generada
// El exploit se generará aquí después de capturar una solicitud
Chat SecureBank

Centro de Aprendizaje CSRF

Aprende todo sobre Cross-Site Request Forgery y cómo protegerte

🎯 ¿Qué es CSRF?

CSRF (Cross-Site Request Forgery) es un ataque que engaña al navegador de un usuario para que ejecute acciones no deseadas en una aplicación web donde el usuario está autenticado.

🔍 Definición Técnica

CSRF es una vulnerabilidad que permite a un atacante inducir a los usuarios a realizar acciones que no tienen la intención de realizar. En un ataque CSRF exitoso, el atacante hace que la víctima ejecute una acción no deseada en una aplicación web en la que la víctima está autenticada.

🎯 Objetivo del Ataque

El objetivo principal es aprovecharse de la confianza que una aplicación web tiene en el navegador del usuario. Si un usuario está autenticado en un sitio web, el navegador enviará automáticamente las cookies de sesión con cada solicitud a ese dominio.

💰 Impacto Potencial

  • Transferencias bancarias no autorizadas
  • Cambios de configuración de cuenta
  • Compras fraudulentas
  • Modificación o eliminación de datos
  • Cambios de contraseña
  • Acciones administrativas no autorizadas
📊 Estadísticas CSRF

OWASP Top 10 2021: A01:2021 - Broken Access Control (incluye CSRF)

Prevalencia: Aproximadamente 94% de aplicaciones tienen alguna forma de control de acceso roto

Impacto: Promedio de 5.4 Common Weakness Enumerations (CWEs) por aplicación

⚙️ Cómo Funciona un Ataque CSRF

🔄 Flujo del Ataque CSRF
1
Autenticación Legítima
El usuario se autentica en el sitio web objetivo (ej: banco online) y recibe cookies de sesión
2
Captura de Solicitud
El atacante observa o captura una solicitud HTTP legítima del usuario (ej: transferencia bancaria)
3
Creación del Payload
El atacante crea una página web maliciosa que replica la solicitud capturada
4
Engaño Social
El atacante engaña al usuario para que visite la página maliciosa (email, link, etc.)
5
Ejecución Automática
El navegador envía automáticamente la solicitud forjada con las cookies de sesión
6
Procesamiento del Servidor
El servidor procesa la solicitud como si fuera legítima, ejecutando la acción no deseada
📊 Diagrama Visual del Ataque CSRF
Diagrama del Ataque CSRF

Representación visual del flujo completo de un ataque CSRF desde la perspectiva del atacante y la víctima

📝 Ejemplo de Payload CSRF
<!-- Formulario oculto que se envía automáticamente -->
<form action="https://banco.com/transfer" method="POST" style="display:none;">
  <input name="to" value="cuenta-atacante">
  <input name="amount" value="1000">
  <input name="currency" value="EUR">
</form>

<script>
  // Envío automático al cargar la página
  document.forms[0].submit();
</script>

⚠️ Condiciones para un Ataque CSRF Exitoso

🍪 Dependencia de Cookies

La aplicación debe usar cookies para autenticación. El navegador las enviará automáticamente con cada solicitud al dominio, incluso si la solicitud se origina desde otro sitio.

🔓 Falta de Verificación de Origen

La aplicación no verifica que la solicitud provenga del sitio legítimo. No valida headers como Origin o Referer.

🎫 Ausencia de Tokens Anti-CSRF

No hay tokens únicos que vinculen la solicitud con la sesión del usuario. Cada formulario debería incluir un token secreto impredecible.

🔄 Acciones Predecibles

Las acciones sensibles tienen parámetros predecibles que un atacante puede replicar fácilmente (nombres de campo, formatos, etc.).

🌐 Configuración Insegura de SameSite

Las cookies no tienen el atributo SameSite configurado o están configuradas como None, permitiendo solicitudes cross-site.

📋 Métodos HTTP Inseguros

La aplicación permite cambios de estado usando métodos GET, o acepta tanto GET como POST para acciones sensibles.

🛡️ Mitigaciones y Defensas

🎫 Tokens Anti-CSRF

Implementar tokens únicos, impredecibles y vinculados a la sesión del usuario.

Implementación en HTML
<input type="hidden" name="csrf_token" value="abc123xyz789">
Validación en el servidor
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
  die('CSRF token inválido');
}

🍪 Configuración Segura de Cookies

Usar el atributo SameSite para prevenir el envío de cookies en solicitudes cross-site.

Configuración recomendada
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly
Opciones SameSite
  • Strict: Nunca envía cookies cross-site
  • Lax: Solo en navegación top-level
  • None: Permite cross-site (requiere Secure)

🔍 Verificación de Origen

Validar las cabeceras Origin y Referer para asegurar que las solicitudes provienen del dominio correcto.

Validación de Origin
if ($_SERVER['HTTP_ORIGIN'] !== 'https://mibanco.com') {
  http_response_code(403);
  die('Origen no autorizado');
}

🛡️ Cabeceras de Seguridad

Implementar cabeceras HTTP adicionales para mejorar la seguridad.

Cabeceras recomendadas
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin

🔒 Doble Confirmación

Para acciones críticas, requerir confirmación adicional como re-autenticación o 2FA.

Ejemplo de implementación
// Para transferencias > $1000, requerir contraseña
if ($amount > 1000 && !verify_password($_POST['password'])) {
  die('Confirmación de contraseña requerida');
}

🌐 Configuración CORS

Configurar CORS de manera restrictiva para limitar solicitudes cross-origin.

Configuración segura
Access-Control-Allow-Origin: https://mibanco.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: Content-Type, Authorization

🛠️ Herramientas de Prueba y Análisis

🔍 Burp Suite

Herramienta profesional para pruebas de seguridad web con extensiones específicas para CSRF.

Características clave:
  • Generación automática de PoCs CSRF
  • Detección de tokens anti-CSRF
  • Análisis de configuración SameSite

🌐 OWASP ZAP

Herramienta gratuita de seguridad web con capacidades de detección CSRF.

Funcionalidades:
  • Escaneo pasivo de vulnerabilidades CSRF
  • Generación de reportes detallados
  • Integración con pipelines CI/CD

🔧 CSRFTester

Herramienta específica para pruebas de CSRF desarrollada por OWASP.

Uso: java -jar CSRFTester.jar
# 1. Configurar proxy
# 2. Navegar por la aplicación
# 3. Generar formularios de prueba

🐍 Python Scripts

Scripts personalizados para automatizar pruebas CSRF.

Ejemplo básico: import requests

# Probar CSRF en endpoint
response = requests.post(
  'https://target.com/transfer',
  data={'to': 'attacker', 'amount': 1000},
  cookies={'session': 'victim_session'}
)

print(f"Status: {response.status_code}")

📝 Ejemplos Prácticos

💰 Transferencia Bancaria

Ejemplo clásico de CSRF para transferencias financieras.

Solicitud legítima: POST /transfer HTTP/1.1
Host: banco.com
Content-Type: application/x-www-form-urlencoded
Cookie: session=abc123

to=1234567890&amount=100¤cy=EUR
Payload malicioso: <form action="https://banco.com/transfer" method="POST">
  <input name="to" value="atacante123">
  <input name="amount" value="5000">
  <input name="currency" value="EUR">
  <input type="submit" value="¡Gana $1000!">
</form>

🔐 Cambio de Contraseña

Ataque para cambiar credenciales de usuario.

Payload encubierto: <img src="https://target.com/change-password?new=hacked123"
     style="display:none;">

<!-- La imagen "cargará" ejecutando el cambio -->

🛒 Compra Fraudulenta

Realizar compras no autorizadas en e-commerce.

JavaScript malicioso: fetch('https://tienda.com/buy', {
  method: 'POST',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    product: 'expensive_item',
    quantity: 10
  })
});

✅ Implementación Segura

Ejemplo de formulario protegido contra CSRF.

Formulario seguro: <form action="/transfer" method="POST">
  <!-- Token Anti-CSRF -->
  <input type="hidden" name="csrf_token"
         value="<?= $_SESSION['csrf_token'] ?>">
  
  <input name="to" required>
  <input name="amount" type="number" required>
  <button type="submit">Transferir</button>
</form>
Validación en servidor: // Verificar token CSRF
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
  die('Token CSRF inválido');
}

// Verificar origen
if ($_SERVER['HTTP_ORIGIN'] !== 'https://mibanco.com') {
  die('Origen no autorizado');
}

// Procesar transferencia segura
process_transfer($_POST['to'], $_POST['amount']);