Requisitos: Recientemente leí el documento ASP.NET Core de Microsoft "Preventing Open Redirect Attacks in ASP.NET Core", que significa aproximadamenteLos desarrolladores deben prestar atención a la ruta del sitio local al saltar a la dirección de devolución para evitar que algunas personas falsificen maliciosamente la dirección de devolución para ataques de phishing。 Estudia el código y prepárate para portarlo al proyecto ASP.NET MVC.
Recuerdo que un fabricante importante ya tenía esta vulnerabilidad antes, y algunas personas la usaron para drenar tráfico de QQ y WeChat, de la siguiente manera:
Aprovechando la vulnerabilidad, algunas herramientas de chat no pudieron impedir que los usuarios hicieran clic en enlaces para acceder a contenido malicioso de sitios web debido a su confianza en los dominios de grandes empresas.
¿Qué es un ataque de redirección abierta?
Las aplicaciones web redirigen frecuentemente a los usuarios a páginas de inicio de sesión cuando acceden a recursos que requieren autenticación. Las redirecciones suelen incluir un parámetro de sequencia de consulta returnUrl para que los usuarios puedan volver a la URL solicitada originalmente tras un inicio de sesión exitoso. Después de autenticarse, el usuario es redirigido a la URL que solicitó originalmente.
Ejemplo de un ataque
Un usuario malicioso puede desarrollar un ataque diseñado para dar acceso a las credenciales o información sensible de un usuario. Para iniciar un ataque, un usuario malicioso engañaría al usuario para que hiciera clic en un enlace a la página de destino de tu sitio y añadiría el valor de la cadena de consulta returnUrl a esa URL. para quecontoso.compor ejemplo, la app está enhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutContiene una página de aterrizaje. El ataque sigue estos pasos:
- El usuario hace clic en un enlace malicioso parahttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(La segunda URL es "contoso1.com", en lugar de "contoso.com”) 。
- El usuario inicia sesión con éxito.
- El usuario es redirigido al sitiohttp://contoso1.com/Account/LogOn(Un sitio malicioso que se parece exactamente al real).
- El usuario vuelve a iniciar sesión (proporcionando credenciales al sitio malicioso) y es redirigido de nuevo al sitio real.
- Los usuarios pueden pensar que su primer intento de inicio de sesión falló y el segundo intento tuvo éxito.Es probable que los usuarios aún no sepan que sus credenciales han sido comprometidas。
Además de las páginas de destino, algunos sitios ofrecen páginas de redirección o endpoints. Supongamos que tu app tiene una página que incluye una redirección abierta, /Inicio/Redirección. Por ejemplo, un atacante podría crear un punto en un correo electrónico[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginenlace. Los usuarios habituales verán que la URL comienza con el nombre de tu sitio. Por confianza, hacen clic en el enlace. Abre redirecciones y luego envía a los usuarios a sitios de phishing que se parecen al tuyo, y los usuarios pueden iniciar sesión en sitios que creen que son tuyos.
Prevenir ataques de redirección abierta
Al desarrollar aplicaciones web, todos los datos proporcionados por el usuario se consideran poco fiables. Si tu app puede redirigir a los usuarios según el contenido de la URL, asegúrate de que dichas redirecciones solo se realicen localmente en tu app (o redirijan a URLs conocidas, no a las que puedan estar en la cadena de consulta).
LocalRedirect
Usando el método Controller helper en la clase base LocalRedirect:
Si se especifica una URL no local, LocalRedirect lanza una excepción. De lo contrario, se comporta igual que el método Redireccionar. La información de las excepciones es la siguiente:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. El código fuente es el siguiente:
Proceso de ejecución: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, y al final, se llamará a IsLocalUrl para juzgar (UrlHelperFactory implementa por defecto la interfaz IUrlHelperFactory. )。
Dirección del código fuente:El inicio de sesión del hipervínculo es visible.
IsLocalUrl
IsLocalUrl antes de redirigir, prueba la URL usando este método:
El código es el siguiente:
El código de prueba es el siguiente:
Si se permite saltar a otros sitios de nombres de dominio, puedes implementar la interfaz IUrlHelperFactory y modificar IServiceCollection para reemplazar la clase de implementación predeterminada cuando inicia el programa.
Referencia:El inicio de sesión del hipervínculo es visible.
(Fin)
|