Para una aplicación web HTTPS, ¿vale la pena cifrar la contraseña antes de enviarla por POST, para evitar que un atacante MITM la capture?

29

Nuestra aplicación ha pasado recientemente por pruebas de penetración. La prueba encontró una violación de seguridad crítica , que es esencialmente:

El problema:

  • El atacante configura un punto WiFi.
  • El usuario ingresa a nuestro sitio (que es HTTPS).
  • Usando una herramienta como Caín, el atacante redirige al usuario a HTTP o lo mantiene en HTTPS con un certificado falsificado. (De cualquier manera, el usuario tuvo que pasar por la página "sácame de aquí" / "agregar excepción")
  • El usuario ingresa su nombre de usuario y contraseña.
  • La contraseña se publica en el atacante MITM, quien puede verla. Al parecer, Caín tiene una función para recolectar automáticamente el nombre de usuario y las contraseñas, y nuestra contraseña sería fácil de capturar allí.

Solución sugerida

El informe recomienda cifrar o hashear la contraseña en el lado del cliente (usando JavaScript), de una manera que no se puede volver a reproducir (por ejemplo, usando un pad / sello de tiempo). No pudieron recomendar un esquema específico (sí mencionaron los certificados de cliente, lo que podría no ser práctico para una aplicación grande).

¿Vale la pena cifrar o hash la contraseña antes de publicarla? ¿Es práctica común?

    
pregunta Kobi 31.08.2014 - 10:47
fuente

3 respuestas

47

Esta recomendación no tiene sentido: El código JavaScript utilizado para marcar o cifrar la contraseña también debe transferirse al cliente. Si el atacante puede montar un ataque de hombre en el medio, también podrá inspeccionar el código JavaScript utilizado para el cifrado o incluso podría reemplazarlo con otra cosa (como ningún cifrado).

Hashing en lugar de encriptación tiene aún menos sentido, porque esto solo funcionaría si el servidor acepta la contraseña hash en lugar de la contraseña real. En este caso, el atacante ni siquiera necesitaría saber la contraseña, solo necesita saber el hash.

Lo que podría ayudar serían los certificados de cliente porque no se puede montar un ataque SSL en el medio que preserva el certificado de cliente (y una degradación a HTTP simple tampoco enviaría el certificado). Pero, debido a que primero tiene que distribuir los certificados a los clientes y hacer que los instalen en el navegador, esta solución funciona solo cuando tiene pocos clientes.

Aparte de eso: si el atacante está en el medio, es posible que no necesite la contraseña en absoluto. Todo lo que necesita es que la víctima haya iniciado sesión y luego el atacante puede hacerse cargo de la sesión existente.

También podría ser útil detectar tal situación de intermediario, para que pueda informar al usuario y denegar el inicio de sesión desde redes comprometidas. Algunas ideas para detectar degradaciones de conexión (es decir, http al atacante que las reenvían como https):

  • Verifique el método de la ubicación actual con JavaScript.
  • Crea una cookie segura con JavaScript. Solo debe devolverse si el sitio se sirve con https (que no es de baja calificación).
  • Incluya un script como HTTP que sirva una imagen y verifique en el lado del servidor cómo se incluyó la imagen. Si se incluyó como HTTPS, puede asumir un ataque de degradación de HTTP porque lo ha incluido explícitamente con HTTP. Si se accede con HTTP, también tiene un ataque de baja calificación (pero con un atacante más inteligente) o el navegador no se preocupa por el contenido mixto.

Y sobre cómo detectar el hombre en el medio con certificados falsos:

  • Configura un segundo sitio https (con un nombre de host diferente) y crea una solicitud ajax para este sitio de una manera que no sea sencillo para el atacante cambiar a http (por ejemplo, crear una URL dinámicamente). Si el atacante simplemente intenta MITM en cualquier sitio, esta solicitud de ajax fallará al menos en algunos navegadores, ya que el certificado no es confiable y el navegador solo solicitará al usuario los certificados principales de un sitio.

Por supuesto, todo esto solo ayuda contra un atacante que no está realmente decidido a hackearte especialmente a ti, sino a los objetivos más fáciles. En este caso, todo lo que debe hacer es ser un poco más difícil de atacar que el resto.

    
respondido por el Steffen Ullrich 31.08.2014 - 10:55
fuente
10

Sugeriría implementar HTTP Strict Transport Security , lo que evita que el usuario acepte el certificado falsificado en primer lugar .

    
respondido por el suriv 02.09.2014 - 03:44
fuente
3

Si desea ignorar que el atacante podría reemplazar fácilmente el código Javascript durante un ataque MITM activo:

Podría generar alguna clave de cifrado asimétrica, proporcione al cliente esa clave pública para usarla para cifrar la contraseña del lado del cliente. Si utiliza una nueva clave para cada inicio de sesión, nadie podrá volver a reproducir la contraseña.

    
respondido por el flob 31.08.2014 - 21:47
fuente

Lea otras preguntas en las etiquetas