Secuestro de sesión y fijación de sesión

Tenemos un problema de secuestro de sesión y fijación de sesión con nuestra aplicación asp.net. También hemos implementado SSL.

1. He agregado el siguiente código en el archivo web.config.

<----

<httpCookies httpOnlyCookies="true" requireSSL="true"   />


  <forms loginUrl="Homepage.aspx"
      protection="All"
      timeout="20"
      name=".ASPXAUTH"
      path="/"
      requireSSL="true" 
      slidingExpiration="true"
      />

--->

2... Cifrado del ticket de autenticación de formularios y agregado a la cookie después de que el usuario sea identificado.

<---

FormsAuthenticationTicket tkt;

cadena cookiestr;

HttpCookie ck;

tkt = new FormsAuthenticationTicket(1, uname, DateTime.Now, DateTime.Now.AddMinutes(20),false, "sus datos personalizados");

cookiestr = FormsAuthentication.Encrypt(tkt);

ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); ck.Path = FormsAuthentication.FormsCookiePath;

Respuesta.Cookies.Add(ck);

->

3. Estoy eliminando las variables de sesión y pasando un valor nulo a ASP.NET_SessionID en la página de cierre de sesión y en la página de error.

Controlador de sesión.EndSession();

    Session.RemoveAll();

    Session.Abandon();

    Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));


    if (Request.Cookies["ASP.NET_SessionId"] != null)
    {
        Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
        Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
    }

    if (Request.Cookies["AuthToken"] != null)
    {
        Response.Cookies["AuthToken"].Value = string.Empty;
        Response.Cookies["AuthToken"].Expires = DateTime.Now.AddMonths(-20);
    }

    HttpCookie authcookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    authcookie.Expires = DateTime.Now.AddDays(-1D);
    Response.Cookies.Add(authcookie);
    FormsAuthentication.SignOut();

todavia no se resuelve el problema...

preguntado el 22 de mayo de 12 a las 20:05

Todo lo que necesitas ahora es una pregunta. -

¿Alguna posibilidad de inyección de HTML en su sitio donde los usuarios puedan poner, por ejemplo, URL de imágenes personalizadas? Esa es una fuente de secuestro de sesión. De lo contrario, la ingeniería social podría estar involucrada y necesitaría realizar un seguimiento de cómo los usuarios acceden a su sitio. No es necesariamente un problema técnico relacionado con las sesiones en sí. -

1 Respuestas

  1. ¿Su problema es el secuestro de sesión, o autenticación ¿secuestro?
  2. ¿Confía en los valores de la sesión sin validar la identidad? (Tenga en cuenta que la sesión y la autenticación no están vinculadas intrínsecamente en ASP.NET).
  3. Si ha implementado SSL, ¿por qué su cookie de sesión todavía está configurada en requireSSL="false"?
  4. Investigue las mejores prácticas y vea por sí mismo dónde se ha equivocado. Por ejemplo - http://www.troyhunt.com/2010/07/owasp-top-10-for-net-developers-part-3.html

Para profundizar en el punto 2.

Hay dos cookies en uso aquí, una es para Session, el otro para FormsAuthentication. La cookie FormsAuth identifica al usuario y se deben tomar todas las medidas razonables para mantenerla segura. Por lo general, requerir SSL es un buen paso (como lo aplicó en la edición de su ejemplo). Sin embargo, la cookie de sesión a menudo no se somete a un escrutinio tan minucioso para los desarrolladores, pero dependiendo de cómo la esté usando puede ser igual de sensible. A Sesión la fijación roba la sesión, no la autenticación

Un ejemplo:

  1. UsuarioA inicia sesión, es un usuario administrador. Reciben una cookie de FormsAuth que dice "Este es el usuario A", también pueden recibir un Sesión cookie que dice "Este usuario es administrador".
  2. El UsuarioB obtiene una copia de la cookie de sesión que pertenece al UsuarioA (pueden hacerlo a través de la intercepción, o incluso simplemente estando en la misma máquina después de que el UsuarioA cierra la sesión si la cookie de sesión no se borra).
  3. UsuarioB inicia sesión, es un usuario de "solo lectura" (no administrador). Reciben una cookie de FormsAuth que dice "Este es UserB", luego inyectar la cookie de sesión robada en el paso 2. Lo que significa que tienen un FormsAuth cookie que dice "Este es UserB", y una Session cookie que dice "Este usuario es administrador".
  4. Presto, UserB ahora es administrador.

El problema aquí (en relación con el punto 2 de mi lista original de preocupaciones) es que el servidor no verificó la identidad del usuario en relación con su sesión. Puede hacer todo lo posible para intentar vincular los tickets de autenticación de sesión y formularios de alguna manera, y definitivamente asegurarse de que está encriptando (SSL). O puede dejar de almacenar datos confidenciales en la sesión (o al menos reducirlos). Cuando se trata de mi ejemplo anterior "Este usuario es administrador", la mejor implementación es usar los proveedores de roles y perfiles de ASP.NET junto con el proveedor de Membresía. Los tres van de la mano, y hay un montón de ejemplos por ahí sobre cómo usarlos para su ventaja.

Esto es sólo uno posible Sin embargo, la línea de investigación y, como señaló acertadamente @JohnFx, realmente necesita una pregunta enfocada aquí antes de poder esperar una buena respuesta. Cuando se trata de la implementación de la seguridad, es importante comprender los conceptos involucrados, en lugar de simplemente arrojar un código de ejemplo al problema. El código de ejemplo proporcionado hasta ahora se parece sospechosamente a un artículo de CodeProject que analiza la fijación de sesiones, pero ¿entiende lo que está tratando de lograr? ¿Sabes si incluso se aplica al problema que estás experimentando?

contestado el 23 de mayo de 12 a las 23:05

Gracias por tu respuesta... No entendí lo que dices en el segundo punto. ¿Confía en los valores de la sesión sin validar la identidad? (Tenga en cuenta que la sesión y la autenticación no están intrínsecamente vinculadas en ASP.NET). - mígico

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.