¿Se puede secuestrar una sesión si se redirige al usuario de HTTPS a HTTP después de iniciar sesión?

6

Estoy desarrollando una aplicación web, que realiza llamadas HTTP siempre y cuando el usuario no haya iniciado sesión.
Una vez que el usuario hace clic en el botón iniciar sesión , se le envía a una "página de inicio de sesión" que es HTTPS.

El inicio de sesión realiza una llamada Ajax a un servlet, donde se agregan algunos atributos específicos a la sesión.
Luego, para resolver el problema de "fijación de sesión" , la sesión actual se invalida y se crea una nueva sesión.

Después de iniciar sesión, el usuario es redirigido a la página de la aplicación pero utilizando HTTP.

Ahora para no perder los atributos de la sesión (entre HTTPS y HTTP) anulé el mecanismo predeterminado Glassfish almacenando en caché la cookie JSESSIONID y enviándola en respuesta: ( esta es una aplicación j2ee)

  Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId());
  cookie.setMaxAge(-1);
  cookie.setSecure(false);
  cookie.setPath(request.getContextPath());
  response.addCookie(cookie);

Funciona bien, pero he estado leyendo sobre Desbordamiento de pila, Seguridad de TI y, en general, en línea que la sesión aún podría ser secuestrada. Por ejemplo, esta respuesta menciona que es una muy mala idea, y que un hombre en el medio puede secuestrarla.

No soy un experto en seguridad, pero me gustaría recibir sus comentarios sobre el siguiente mecanismo que construí:

  • Al escribir la URL de la aplicación web, la primera página de destino es HTTP. Todos los mecanismos son HTTP.
  • Cuando el usuario decide "iniciar sesión", se le redirige a una página, y esa página de "aterrizaje" es HTTPS (aplicada a través de j2ee CONFIDENCIAL restricción de seguridad)
  • En el servlet, la reparación de la sesión se realiza mediante la invalidación de la sesión y la creación de una nueva. Luego se agregan los atributos de la sesión.
  • Para no perder los atributos de la sesión mientras regresa a HTTP, una cookie se reemplaza manualmente con el mismo "ID de sesión" y se establece en "no segura".
  • Todas las solicitudes de aplicaciones son de nuevo HTTP.

¿Sigue siendo este un objetivo fácil para el secuestro de sesiones / MITM / o cualquier otra falla de seguridad?
Agradecería sus comentarios, ya que no tengo mucha experiencia con los detalles de seguridad.

    
pregunta shadesco 27.04.2012 - 21:01
fuente

4 respuestas

9

Cada vez que solicite una página con HTTP, todo se envía en texto sin formato, lo que significa que la cookie de sesión que contiene el ID también se envía en texto sin formato (incluso para solicitudes de imágenes). Eso lo convierte en un blanco fácil para los ataques MITM. Puede configurar la cookie para enviarla solo a las páginas HTTPS, pero, por supuesto, perderá la sesión y luego las páginas HTTP.

La mejor manera de resolver este problema es, para hacer que todo el sitio sea HTTPS, puede evitar muchos problemas de esta manera. Siempre que su sitio no tenga mucho tráfico, no debería ser un problema para los servidores de hoy.

Si realmente tiene que cambiar entre las páginas HTTP y HTTPS, puede separar las dos preocupaciones de mantener la sesión y la autenticación. Puede agregar una segunda cookie solo para autenticación y restringirla a páginas HTTPS solamente. La cookie de sesión se puede usar para solicitudes HTTP y HTTPS. Escribí un ejemplo de cómo podría implementarse esto (está escrito en PHP, pero la idea puede implementarse en otros entornos también).

    
respondido por el martinstoeckli 27.04.2012 - 21:50
fuente
4

Sí. La sesión puede ser secuestrada. Su enfoque no es seguro. La única forma de proporcionar una seguridad razonable es usar HTTPS para todo.

Usted está enviando el ID de sesión a través de HTTP, lo que significa que está en claro, lo que significa que puede ser interceptado. Una vez que es interceptado, el atacante tiene todo lo necesario para tomar el control de la cuenta del usuario (incluidas, posiblemente, las partes de la aplicación que ha relegado a HTTPS).

Le animo a leer sobre Firesheep, que explota exactamente este tipo de arquitectura. Los sitios necesitan usar HTTPS para todo, si quieren estar seguros contra las escuchas ilegales y los ataques de intermediarios (por ejemplo, si quieren estar seguros para los usuarios que se conectan a través de Wifi abierto).

Vea las siguientes preguntas en este sitio: ¿Cuáles son los pros y los contras de SSL (https) en todo el sitio? , ¿Cuándo corren riesgo las cookies de sesión HTTP a través de Wi-Fi? , y ¿Qué sitios aún son vulnerables a FireSheep? .

Esto es lo que sugiero para tu sitio:

  • Use SSL en todo el sitio: es decir, use solo HTTPS, no HTTP. No uses HTTP para nada; utilice solo HTTPS. Habilitar seguridad de transporte estricta de HTTP. Establezca la marca de seguridad en todas las cookies.

  • Piense detenidamente acerca de cómo autenticar a los usuarios.

respondido por el D.W. 28.04.2012 - 09:00
fuente
2

Uno de los vectores de ataque más grandes cuando se trata de HTTPS se basa en engañar al usuario. Siempre es responsabilidad del usuario verificar que HTTPS se usa cuando lo esperan. Solo los usuarios pueden verificar si no se han actualizado a HTTP simple (y que los certificados son válidos).

La "restricción de seguridad CONFIDENCIAL j2ee" es apenas útil a este respecto. Sí, forzará una redirección, pero esta redirección podría ser manejada por un MITM activo en su lugar. Asegúrate de que los enlaces de las secciones HTTPS usan https:// (más detalles aquí ).

Como dijo @martinstoeckli, si puedes, usa HTTPS en todas partes. Si falla, asegúrese de que siempre que haya juzgado el HTTPS se requiera más importante, los usuarios deben esperar usar el HTTPS (y se alejarán si esas páginas solo usan HTTP simple).

Hay muy pocas soluciones técnicas para asegurarse de que el usuario realice las verificaciones correctas. Uno de ellos es que los usuarios utilicen un navegador que admita HTTP Strict Transport Security , aunque (a) necesitarían tener dicho navegador y (b) esperar HTTPS la primera vez (esto es mejor si hay un precargado lista de sitios habilitados para HSTS ).

    
respondido por el Bruno 27.04.2012 - 22:53
fuente
-1

Estas son preguntas típicas donde la respuesta no importa.

Si la respuesta es Sí, puede ser secuestrada, usted sabe que tiene que tomar contramedidas.

Si la respuesta es No ... todo lo que se dice es: "No tengo conocimiento de ningún vector de ataque", pero nunca puedes estar 100% seguro y aún tienes que tomar medidas en contra.

Entonces, cualquiera que sea la respuesta, tome medidas a la contra o no redirija a http.

Nunca puedes estar seguro de que algo está 'a prueba de fallos', solo puedes probar que algo falló.

    
respondido por el jippie 27.04.2012 - 22:06
fuente

Lea otras preguntas en las etiquetas