Estoy confundido acerca de cómo implementar la funcionalidad de restablecimiento de contraseña. Estoy probando una aplicación web con dos roles: administrador y usuario normal. Solo los administradores pueden usar la funcionalidad de restablecimiento de contraseña (no tiene MFLAC).
Esta función encuentra un usuario y carga una vista con datos básicos, por ejemplo "TEST_USER" con correo electrónico "[email protected]". Los campos no tienen el atributo "solo lectura", por lo que pueden ser modificados por el administrador. Cuando el usuario hace clic en el botón "Restablecer", la aplicación envía un correo electrónico a "TEST_USER" con una URL ( https://host.com/resetPassword.aspx?token=TOKEN
).
El enlace carga una página con dos campos, "nueva contraseña" y "verificar nueva contraseña". Aquí cambié exitosamente la contraseña y completé el proceso.
Si un atacante cambia el valor en el campo "correo electrónico" y ingresa "[email protected]", la aplicación enviará el enlace al atacante, lo que permitirá al atacante cambiar la contraseña. Es importante mencionar que esta función es susceptible a CSRF porque no tiene un token .
Así que creo que esto es una vulnerabilidad porque un atacante o administrador puede cambiar el correo electrónico y restablecer la contraseña para cualquier usuario sin que ellos lo sepan. Al usar CSRF, un atacante puede enviar una URL maliciosa que restablece la contraseña a un administrador.
Entonces, creo que esta no es una forma correcta de implementar esta funcionalidad porque he escuchado que una buena práctica es enviar solo un token a la dirección de correo electrónico.
Creo que la forma correcta de hacerlo sería:
- Asegúrese de que la dirección de correo electrónico pertenezca al usuario cuya contraseña se está restableciendo.
- Debes enviar solo un token en lugar de una URL.
- En la página
ResetPassword.aspx
pega el token. - Verifique al usuario con preguntas de seguridad.
- Permita que el usuario complete "nueva contraseña" y "verifique la nueva contraseña"
¿Esto es una vulnerabilidad? ¿Es esta la forma correcta de implementar esta funcionalidad?