La contraseña del jefe de finanzas
Una empresa tiene un portal para su personal. Una noche, alguien prueba una lista corta de contraseñas comunes con cada nombre del listado. En pocos minutos entra con la cuenta del jefe de finanzas.
El portal no ponía ningún límite a los intentos. Nadie forzó nada: el portal dejó probar sin parar.
La regla única
Advertencia
Este laboratorio es una web insegura a propósito. Ataca solo tu copia privada, que no tiene salida a internet. Atacar un sistema que no es tuyo, o que no tienes permiso para probar, es delito en casi todos los países.
Al final de esta lección
Nota
Puedo decir qué hace débiles un acceso y una sesión.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Sesión | el periodo en que la web te reconoce tras entrar con tu usuario y contraseña | |
| Cookie de sesión | dato que identifica tu sesión en cada petición | JSESSIONID |
| Token | texto firmado que prueba quién eres y hasta cuándo | |
| Fuerza bruta | probar muchas contraseñas hasta acertar | |
| Secure | marca que hace viajar una cookie solo por conexión cifrada | |
| Caducidad | momento en que un token deja de valer |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una contraseña débil cede ante la lista
Quien ataca no prueba todas las combinaciones. Prueba primero las contraseñas más comunes, una tras otra, con cada nombre de la lista de personal.
Una contraseña es débil si es corta, si está en esa lista o si contiene el nombre del usuario. También si usa un solo tipo de signo, como solo letras.
Ejemplo resuelto: cuatro contraseñas
| Contraseña | Problema | Por qué |
|---|---|---|
| abc | Corta | Con tres letras hay muy pocas posibilidades |
| contrasena123 | Común | Está en las listas que se prueban primero |
| lucia-Naranja-2024 | Lleva el usuario | Quien conoce el nombre la adivina |
| Mesa-Verde-Lluvia-58 | Ninguno | Larga, rara y mezcla signos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira las sesiones de tu laboratorio
Tu laboratorio ejecuta WebGoat. Arráncalo y espera un minuto. Estos tres comandos miran la puerta sin iniciar sesión. El segundo pide una página que exige sesión. El tercero muestra la cookie que pone el laboratorio.
¿Está lista la página de acceso?
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/loginSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una página que exige sesión
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/welcome.mvcSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La cookie que pone esa respuesta
curl -s -I http://web/WebGoat/welcome.mvc | grep -i "^set-cookie"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué te dicen las tres respuestas
El primero imprime 200 y ninguna dirección. El segundo imprime 302 y la dirección de acceso: una página con sesión obligatoria manda a los desconocidos a la puerta. El tercero imprime una cookie JSESSIONID con Path=/WebGoat; HttpOnly.
El valor es aleatorio y cambia cada vez. Lleva HttpOnly. No lleva Secure, porque este laboratorio usa HTTP sin cifrar.
Un token se firma y caduca
Algunas webs, en vez de una cookie, entregan un token que el navegador envía en cada petición. El token dice quién eres y hasta cuándo vale, y lleva una firma del servidor.
Dos fallos son frecuentes: aceptar un token sin comprobar la firma, y no poner caducidad o ponerla muy lejos.
Ejemplo resuelto: tres tokens
| Token | Firma | Caduca | Veredicto |
|---|---|---|---|
| T1 | Válida | En 15 minutos | Aceptable |
| T2 | No comprobada | En 15 minutos | Rechazar: cualquiera puede inventarlo |
| T3 | Válida | Hace una hora | Rechazar: ya caducó |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Comprobar un token
now = 1000
# Cambia expires a 900 y pulsa Run. Luego cambia signed a False.
signed = True
expires = 1600
if not signed:
print("rechazado: sin firma")
elif expires <= now:
print("rechazado: caducado")
else:
print("aceptado")
Un error frecuente
Advertencia
Mucha gente cree que un token de aspecto aleatorio está oculto y por eso es seguro. No es así. El token viaja en cada petición y se puede copiar. Lo que lo protege es la firma, la caducidad y la conexión cifrada. Su aspecto no protege nada.
Qué hace fuerte un acceso
Un acceso fuerte limita los intentos, bloquea o frena tras varios fallos y pide más de un factor en cuentas importantes. Guarda las contraseñas con un hash lento (una huella de un solo sentido que no se puede deshacer), nunca en claro.
Una sesión fuerte cambia de identificador tras iniciar sesión, caduca, lleva HttpOnly y Secure, y se cierra de verdad al salir.
Para ir más allá: otro destinatario
Un token bien firmado y sin caducar puede estar hecho para otra aplicación de la misma empresa. Por eso muchos tokens dicen también para quién son.
En show-token, añade audience = "nominas" y una comprobación que rechace el token con el mensaje rechazado: no es para este portal si audience no vale "portal". Decide en qué lugar del if va y explica por qué.