Identification and authentication failures
¿Identificación, autenticación o autorización?Primero, debemos entender la diferencia entre identificación y autenticación:Identificación: Es el proceso donde se proporciona una identidad; un usuario o sistema indica quién es. Autenticación: Es el proceso de verificar una identidad. Cuando un usuario o sistema se identifica, indica quién es; cuando se autentica, se comprueba que sea quien dice ser. Aunque la mayoría de los fallos más conocidos son de autenticación, ya que ahí se realizan los controles de seguridad para verificar la identidad de los usuarios, también existen fallos en el proceso de identificación que pueden afectar a la seguridad de la información. Algunos ejemplos son:Identificación incorrecta o no reconocida: Si un usuario introduce un nombre de usuario o ID no registrado en el sistema, el proceso de identificación falla porque no se encuentra ninguna identidad asociada a esa entrada. Identidad duplicada: En algunos sistemas, pueden existir dos cuentas con nombres de usuario similares o ID muy parecidos, lo que genera confusión al intentar asociar a qué usuario se refiere la identificación. Por otra parte, es crucial entender la diferencia entre autenticación y autorización, que, aunque suenan similar, son procesos distintos. Mientras la autenticación, como hemos explicado, verifica la identidad de un usuario o sistema, la autorización determina si ese usuario o sistema tiene permiso para realizar o acceder a determinada acción o recurso.Factores de autenticaciónExisten tres tipos principales de factores de autenticación, basados en principios simples: algo que el usuario sabe, algo que el usuario tiene y algo que el usuario es.Algo que el usuario sabe: por ejemplo, una contraseña o la respuesta a una pregunta de seguridad. Algo que el usuario tiene: como un objeto físico o un token de seguridad. Algo que el usuario es: como un dato biométrico (huella dactilar) o patrones de comportamiento. Aunque las contraseñas siguen siendo el mecanismo de autenticación más común, cada sistema puede requerir diferentes tipos de factores para verificar la identidad del usuario. Hoy en día, existen múltiples mecanismos: desde aquellos basados únicamente en datos biométricos (como el desbloqueo de smartphones) hasta los que utilizan hardware específico (como dispositivos extraíbles). Además, es cada vez más frecuente el uso de autenticación multifactorial, combinando, por ejemplo, contraseñas con tokens de seguridad.Este panorama diverso de mecanismos de autenticación ofrece mayor flexibilidad y mejora la seguridad general de los sistemas. Sin embargo, también introduce nuevas complejidades y potenciales puntos débiles que los atacantes podrían explotar.A continuación, analizaremos los distintos tipos de vulnerabilidades relacionadas con el proceso de autenticación, agrupándolas según el mecanismo afectado. Nos centraremos en estas vulnerabilidades ya que representan la mayoría de los fallos de seguridad en este ámbito.Autenticación basada en contraseñaLos sistemas que utilizan únicamente usuario y contraseña como método de autenticación confían plenamente en la contraseña como prueba de identidad del usuario. Esto implica que un atacante que obtenga las credenciales de un usuario podría comprometer completamente el proceso de autenticación. Existen diversos tipos de ataques para vulnerar este mecanismo:Fuerza brutaLos ataques de fuerza bruta son un proceso de prueba y error donde el atacante introduce constantemente distintas credenciales —de manera aleatoria, siguiendo reglas o utilizando diccionarios de palabras— con el fin de descubrir las credenciales de un usuario legítimo.Antes de intentar descubrir la contraseña, si no se conoce ningún nombre de usuario, es necesario realizar una enumeración de usuarios. Existen varios métodos para identificar nombres de usuarios válidos en una aplicación web.El primero se basa en la respuesta del servidor. Al introducir un usuario registrado en la aplicación, recibimos una respuesta distinta a la que obtenemos al introducir un usuario inexistente. Para automatizar este proceso, podemos utilizar herramientas como el Intruder de BurpSuite, que permite realizar ataques de fuerza bruta a parámetros en una petición web utilizando diccionarios de palabras o reglas para generar secuencias de caracteres y números. En el siguiente ejemplo, observamos que una de las palabras introducidas devuelve una respuesta de tamaño distinto al resto:Verificamos en la respuesta de esta petición que la plataforma indica que la contraseña no es válida, a diferencia del resto de respuestas que señalan que el usuario introducido no es válido:No siempre es algo tan obvio; a veces debemos fijarnos en fallos sutiles del propio programa. En el siguiente caso, observamos una situación similar. Aunque todas las respuestas tienen distinto tamaño e indican que el usuario o la contraseña no son válidos, existe un pequeño fallo ortográfico en la programación de la respuesta. Este error provoca que, a
¿Identificación, autenticación o autorización?
Primero, debemos entender la diferencia entre identificación y autenticación:
- Identificación: Es el proceso donde se proporciona una identidad; un usuario o sistema indica quién es.
- Autenticación: Es el proceso de verificar una identidad. Cuando un usuario o sistema se identifica, indica quién es; cuando se autentica, se comprueba que sea quien dice ser.
Aunque la mayoría de los fallos más conocidos son de autenticación, ya que ahí se realizan los controles de seguridad para verificar la identidad de los usuarios, también existen fallos en el proceso de identificación que pueden afectar a la seguridad de la información. Algunos ejemplos son:
- Identificación incorrecta o no reconocida: Si un usuario introduce un nombre de usuario o ID no registrado en el sistema, el proceso de identificación falla porque no se encuentra ninguna identidad asociada a esa entrada.
- Identidad duplicada: En algunos sistemas, pueden existir dos cuentas con nombres de usuario similares o ID muy parecidos, lo que genera confusión al intentar asociar a qué usuario se refiere la identificación.
Por otra parte, es crucial entender la diferencia entre autenticación y autorización, que, aunque suenan similar, son procesos distintos. Mientras la autenticación, como hemos explicado, verifica la identidad de un usuario o sistema, la autorización determina si ese usuario o sistema tiene permiso para realizar o acceder a determinada acción o recurso.
Factores de autenticación
Existen tres tipos principales de factores de autenticación, basados en principios simples: algo que el usuario sabe, algo que el usuario tiene y algo que el usuario es.
- Algo que el usuario sabe: por ejemplo, una contraseña o la respuesta a una pregunta de seguridad.
- Algo que el usuario tiene: como un objeto físico o un token de seguridad.
- Algo que el usuario es: como un dato biométrico (huella dactilar) o patrones de comportamiento.
Aunque las contraseñas siguen siendo el mecanismo de autenticación más común, cada sistema puede requerir diferentes tipos de factores para verificar la identidad del usuario. Hoy en día, existen múltiples mecanismos: desde aquellos basados únicamente en datos biométricos (como el desbloqueo de smartphones) hasta los que utilizan hardware específico (como dispositivos extraíbles). Además, es cada vez más frecuente el uso de autenticación multifactorial, combinando, por ejemplo, contraseñas con tokens de seguridad.
Este panorama diverso de mecanismos de autenticación ofrece mayor flexibilidad y mejora la seguridad general de los sistemas. Sin embargo, también introduce nuevas complejidades y potenciales puntos débiles que los atacantes podrían explotar.
A continuación, analizaremos los distintos tipos de vulnerabilidades relacionadas con el proceso de autenticación, agrupándolas según el mecanismo afectado. Nos centraremos en estas vulnerabilidades ya que representan la mayoría de los fallos de seguridad en este ámbito.
Autenticación basada en contraseña
Los sistemas que utilizan únicamente usuario y contraseña como método de autenticación confían plenamente en la contraseña como prueba de identidad del usuario. Esto implica que un atacante que obtenga las credenciales de un usuario podría comprometer completamente el proceso de autenticación. Existen diversos tipos de ataques para vulnerar este mecanismo:
Fuerza bruta
Los ataques de fuerza bruta son un proceso de prueba y error donde el atacante introduce constantemente distintas credenciales —de manera aleatoria, siguiendo reglas o utilizando diccionarios de palabras— con el fin de descubrir las credenciales de un usuario legítimo.
Antes de intentar descubrir la contraseña, si no se conoce ningún nombre de usuario, es necesario realizar una enumeración de usuarios. Existen varios métodos para identificar nombres de usuarios válidos en una aplicación web.
El primero se basa en la respuesta del servidor. Al introducir un usuario registrado en la aplicación, recibimos una respuesta distinta a la que obtenemos al introducir un usuario inexistente. Para automatizar este proceso, podemos utilizar herramientas como el Intruder de BurpSuite, que permite realizar ataques de fuerza bruta a parámetros en una petición web utilizando diccionarios de palabras o reglas para generar secuencias de caracteres y números. En el siguiente ejemplo, observamos que una de las palabras introducidas devuelve una respuesta de tamaño distinto al resto:
- Respuesta correcta:
- Respuesta incorrecta:
Evasión de bloqueos por IP
Evasión del bloqueo de cuenta de usuario
Autenticación de acceso básica
Autenticación de factor múltiple
Evasión del doble factor de autenticación
Movimiento lateral por fallo de implementación
Vulnerabilidades en otros mecanismos de autenticación
Opción de “Mantenme autenticado”
Robo de cookie a través de XSS
Error en cambio de contraseña
Envenenamiento de cambio de contraseña
Cómo prevenir ataques de autenticación
- Cuidado con las credenciales: Nunca enviar datos de inicio de sesión a través de conexiones no cifradas. Implementar HTTPS y redirigir automáticamente las solicitudes HTTP. Auditar el sitio para evitar la exposición de nombres de usuario o correos electrónicos.
- No depender de los usuarios: Los usuarios suelen evitar políticas estrictas de seguridad. En lugar de aplicar políticas tradicionales de contraseñas, es más eficaz utilizar verificadores de contraseñas, como la biblioteca zxcvbn, que brindan retroalimentación en tiempo real sobre la fortaleza de las contraseñas.
- Prevenir la enumeración de nombres de usuario: Evitar dar pistas sobre si un usuario existe en el sistema mediante mensajes de error genéricos, con tiempos de respuesta y códigos HTTP idénticos.
- Protección contra ataques de fuerza bruta: Implementar límites en el número de intentos de inicio de sesión por dirección IP y utilizar CAPTCHA después de varios intentos fallidos. Esto dificulta que los atacantes realicen ataques de fuerza bruta de manera eficiente.
- Verificación de lógica: Auditar exhaustivamente la lógica de autenticación para asegurarse de que no haya fallos o posibles bypasses que puedan ser explotados.
- Atención a funcionalidades adicionales: Funciones como el restablecimiento de contraseñas también son vulnerables, por lo que deben ser tan seguras como el inicio de sesión principal.
- Autenticación multifactor (2FA): Implementar 2FA usando aplicaciones o dispositivos dedicados es más seguro que métodos como el envío de códigos por SMS o correo. Auditar la lógica del 2FA para evitar que sea eludido.