Prevención de ataques de redireccionamiento abierto en ASP.NET Core

Una aplicación web que redirige a una dirección URL especificada a través de la solicitud, como la cadena de consulta o los datos del formulario, puede alterarse, 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 tiene funcionalidad integrada para ayudar a proteger las aplicaciones frente a ataques de redirección abierta (también conocidos como redireccionamiento abierto).

¿Qué es un ataque de redirección abierta?

Las aplicaciones web redirigen con frecuencia a los usuarios hacia una página de inicio de sesión cuando acceden a los recursos que requieren autenticación. Normalmente, el redireccionamiento incluye un parámetro de cadena de consultareturnUrl para que el usuario pueda retornar a la dirección URL solicitada en primer lugar después de haber iniciado sesión correctamente. Después de que el usuario se autentique, se le redirigirá a la dirección URL que había solicitado originalmente.

Debido a 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 redirección abierta (o redireccionamiento).

Un ataque de ejemplo

Un usuario malintencionado puede desarrollar un ataque destinado a permitir que el usuario malintencionado acceda a las credenciales o a la información confidencial de un usuario. Para comenzar el ataque, el usuario malintencionado convence al usuario de hacer clic en un vínculo a la página de inicio de sesión del sitio con un valor de cadena de consulta returnUrl agregado a la dirección URL. Por ejemplo, considere una aplicación en contoso.com que incluya 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 http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (la segunda dirección URL es "contoso1.com", no "contoso.com").
  2. El usuario inicia sesión correctamente.
  3. El usuario se redirige (por el sitio) a http://contoso1.com/Account/LogOn (un sitio malintencionado que se parece exactamente al sitio real).
  4. El usuario inicia sesión de nuevo (dando a un sitio malintencionado sus credenciales) y se redirige de nuevo al sitio real.

Es probable que el usuario crea que su primer intento de iniciar sesión ha fallado y que su segundo intento es correcto. Lo más probable es que el usuario desconoce que sus credenciales están en peligro.

Open Redirection Attack Process

Además de las páginas de inicio de sesión, algunos sitios proporcionan páginas de redirección o puntos de conexión. Imagine que la aplicación tiene una página con una redirección abierta, /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 examinará la dirección URL y verá que comienza por el nombre de su sitio. Confiando en eso, harán clic en el vínculo. A continuación, la redirección abierta envía al usuario al sitio de suplantación de identidad, que parece idéntico al suyo, y es probable que el usuario inicie sesión en lo que cree que es su sitio.

Protección contra ataques de redirección abierta

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 dichas redirecciones solo se realizan localmente dentro de la aplicación (o a una dirección URL conocida, no a una dirección URL que pueda ser proporcionada en la cadena de consulta).

LocalRedirect

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

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 método Redirect.

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 redirigir.

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

El método IsLocalUrl protege a los usuarios de ser redirigidos inadvertidamente a un sitio malintencionado. Puede registrar los detalles de la dirección URL que fue proporcionada cuando se provee una dirección URL no local en una situación en la que esperaba una dirección URL local. Las direcciones URL de redirección en el registro pueden ayudar a diagnosticar ataques de redireccionamiento.