Evitar ataques de redireccionamiento abierto en ASP.NET Core

Una aplicación web que redirige a una dirección URL que se especifica a través de la solicitud, como la cadena de consulta o los datos del formulario, se puede alterar potencialmente para redirigir a los usuarios a una dirección URL externa malintencionada. Esta manipulación se denomina ataque de redireccionamiento abierto.

Siempre que la lógica de la aplicación redirija a una dirección URL especificada, debe comprobar que la dirección URL de redireccionamiento no se ha alterado. ASP.NET Core funcionalidad integrada para ayudar a proteger las aplicaciones frente a ataques de redireccionamiento abierto (también conocido como redireccionamiento abierto).

¿Qué es un ataque de redireccionamiento abierto?

Las aplicaciones web suelen redirigir a los usuarios a una página de inicio de sesión cuando acceden a recursos que requieren autenticación. Normalmente, el redireccionamiento incluye un parámetro querystring para que el usuario pueda devolverse a la dirección URL solicitada originalmente después de haber returnUrl iniciado sesión correctamente. Una vez que el usuario se autentica, se le redirige a la dirección URL que había solicitado originalmente.

Dado que la dirección URL de destino se especifica en la cadena de consulta de la solicitud, un usuario malintencionado podría alterar la cadena de consulta. Una cadena de consulta alterada podría permitir que el sitio redirija al usuario a un sitio externo malintencionado. Esta técnica se denomina ataque de redireccionamiento abierto (o redireccionamiento).

Un ataque de ejemplo

Un usuario malintencionado puede desarrollar un ataque diseñado para permitir el acceso del usuario malintencionado a las credenciales o información confidencial de un usuario. Para comenzar el ataque, el usuario malintencionado presiona al usuario para que haga clic en un vínculo a la página de inicio de sesión del sitio con un valor de cadena de consulta agregado a returnUrl la dirección URL. Por ejemplo, considere una aplicación en contoso.com que incluye una página de inicio de sesión en http://contoso.com/Account/LogOn?returnUrl=/Home/About . El ataque sigue estos pasos:

  1. El usuario hace clic en un vínculo malintencionado a (la segunda http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn dirección URL es "contoso 1.com", no "contoso.com").
  2. El usuario inicia sesión correctamente.
  3. El usuario se redirige (por el sitio) http://contoso1.com/Account/LogOn a (un sitio malintencionado que se parece exactamente al sitio real).
  4. El usuario inicia sesión de nuevo (lo que da sus credenciales al sitio malintencionado) y se redirige de nuevo al sitio real.

El usuario probablemente cree que su primer intento de iniciar sesión no se pudo realizar y que su segundo intento se ha realizado correctamente. Lo más probable es que el usuario no sea consciente de que sus credenciales están en peligro.

Abrir el proceso de ataque de redireccionamiento

Además de las páginas de inicio de sesión, algunos sitios proporcionan páginas de redireccionamiento o puntos de conexión. Imagine la aplicación tiene una página con un redireccionamiento abierto, /Home/Redirect . Un atacante podría crear, por ejemplo, un vínculo en un correo electrónico que vaya a [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login . Un usuario típico verá la dirección URL y verá que comienza con el nombre del sitio. Si confía en eso, hará clic en el vínculo. A continuación, el redireccionamiento abierto enviaría al usuario al sitio de suplantación de identidad (phishing), que es idéntico al de usted, y es probable que el usuario inicie sesión en lo que cree que es su sitio.

Protección contra ataques de redireccionamiento abierto

Al desarrollar aplicaciones web, trate todos los datos proporcionados por el usuario como no confiables. Si la aplicación tiene funcionalidad que redirige al usuario en función del contenido de la dirección URL, asegúrese de que estos redireccionamientos solo se realizan localmente dentro de la aplicación (o a una dirección URL conocida, no a ninguna dirección URL que se pueda proporcionar en la cadena de consulta).

LocalRedirect

Use el LocalRedirect método auxiliar de la clase Controller base:

public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl);
}

LocalRedirect producirá una excepción si se especifica una dirección URL no local. De lo contrario, se comporta igual que el Redirect método .

IsLocalUrl

Use el método IsLocalUrl para probar las direcciones URL antes de redirigir:

En el ejemplo siguiente se muestra cómo comprobar si una dirección URL es local antes de redirigirla.

private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}

El método protege a los usuarios de que se redirijan accidentalmente IsLocalUrl a un sitio malintencionado. Puede registrar los detalles de la dirección URL que se proporcionó cuando se proporciona una dirección URL no local en una situación en la que esperaba una dirección URL local. El registro de direcciones URL de redireccionamiento puede ayudar a diagnosticar ataques de redireccionamiento.