¿Por qué la Autenticación Básica de HTTP/1.1 es vulnerable? (+Ejemplo)

La Autenticación Básica (Basic Authentication, Basic Access Authentication ) se incluyó en la especificación de HTTP/1.1 con el objetivo de proveer un mecanismo simple de autenticación que pudiera servir por defecto a los desarrolladores ante la ausencia de un esquema más elaborado de autenticación. En la propia RFC 2617, se especificó lo siguiente:

The Basic authentication scheme is not a secure method of user authentication, nor does it in any way protect the entity, which is transmitted in cleartext across the physical network used as the carrier. HTTP does not prevent the addition of enhancements (such as schemes to use one-time passwords) to Basic authentication.

Leído la cita anterior, podemos entender que, si los mismos ingenieros que crearon la Autenticación Básica expresan que no es un método seguro de autenticación, debemos andarnos con cuidado a la hora de usarlo y como mínimo garantizar que se utilice sobre HTTPS. Pudiera parecer que esto es un conocimiento que todo desarrollador web debe poseer, sin embargo, en mi opinión esta cuestión no se trata con suficiente claridad en los libros de programación estándares. En esta entrada pretendo explicar en qué consiste la Autenticación Básica y demostrar cuáles son sus puntos vulnerables, comencemos:

La Autenticación Básica, en las aplicaciones web que la utilicen, se pone en marcha cuando el usuario, a través de un user-agent realiza la petición de un recurso protegido. Si nuestro user-agent es un navegador web, podemos apreciar una ventana emergente que nos solicita el nombre de usuario y la contraseña (Figuras 1 y 2).

Figura 1 - Autenticación Básica Firefox

Figura 1. Aplicación Web solicitando las credenciales de usuario en un proceso de Autenticación Básica en Firefox. Elaboración Propia.

Figura 2 - Autenticación Básica MS Edge

Figura 2. Aplicación Web solicitando las credenciales de usuario en un proceso de Autenticación Básica en Microsoft Edge. Elaboración Propia.

La Autenticación Básica no depende de cookies, ID de Sesión ni nada similar, es simplemente un mecanismo para enviar las credenciales del usuario codificadas en Base64 cada vez que este realice una petición a un recurso, lo que por supuesto, crea una situación muy vulnerable al transmitirse constantemente una información tan sensible para el usuario. Pero bueno, para comprender bien del funcionamiento de la Autenticación Básica les propongo apoyarnos en una aplicación web llamada WebGoat, la cual forma parte del arsenal de aplicaciones vulnerables del proyecto BWA de OWASP(Figura 3):

Figura 3 - Aplicación Web WebGoat de BWA

Figura 3. Página de inicio de WebGoat. Elaboración propia.

Podemos orientarnos inicialmente con el esquema de la Figura 4, la cual resume todas las peticiones y respuestas HTTP que van a producirse:

Figura 4 - Ejemplo Autenticación Básica

Figura 4. Esquema deun ejemplo de Autenticación Básica. Elaboración propia.

La secuencia de pasos que establece la Autenticación Básica es muy sencilla como se muestra a continuación:

  1. Un usuario, a través de un user-agent realiza la petición de un recurso al servidor de aplicaciones web (Figura 5).
  2. El servidor de aplicaciones comprueba que no le han enviado las credenciales, informa que el usuario no tiene permisos para acceder al recurso y solicita el envío de credenciales válidas (Figura 6). Utiliza un código de respuesta HTTP 401 Unauthorized e incorpora el campo de encabezado HTTP WWW-Authenticate: Basic realm=”contenido” (Contenido es un texto con algún significado semántico como por ejemplo el nombre de la aplicación web).
  3. El navegador web solicita las credenciales del usuario (figura 1 y 2) y las envía mediante el campo de encabezado HTTP Authorization: Basic Datos-Credenciales (Figura 7). Datos-Credenciales es una cadena resultante de la codificación en Base64 del nombre de usuario y la contraseña separadas por dos puntos (DatosCredenciales=Base64(username:password))
  4. El servidor comprueba que las credenciales sean correctas y devuelve un código de respuesta HTTP 200 OK y el recurso solicitado (Figura 8). Si las credenciales tienen problema, envía la misma respuesta del punto 2.
  5. A partir de este punto, se enviará en cada petición el campo de encabezado HTTP Authorization: Basic Datos-Credenciales (Figura 9).
Figura 5 - Petición inicial de recurso.png

Figura 5. El user-agent realiza la petición del recurso solicitado. Elaboración propia.

Figura 6 - Servidor solicita credenciales

Figura 6. El servidor responde con un código 401 y solicita las credenciales mediante el campo de encabezado de respuesta HTTP WWW-Authenticate: Basic realm=”contenido. Elaboración propia.

Figura 7 - User-Agent envía las credenciales.png

Figura 7. El user-agent envía las credenciales codificadas con Base64 en el campo de encabezado de petición HTTP Authorization: Basic username:password. Elaboración propia.

Figura 8 - Servidor responde con recurso solicitado

Figura 8. El servidor responde con un código 200 si las credenciales son correctas y tienen los permisos necesarios. Elaboración

Figura 9 - Credenciales en todas las peticiones posteriores.png

Figura 9. Las credenciales deben ser enviadas en todas las peticiones. Elaboración propia.

La mayor vulnerabilidad que presente este método es que las credenciales son transmitidas en texto claro, solo codificadas en Base64 lo que permite que un atacante pueda decodificarla con facilidad si son capturadas. En la entrada dedicada a la codificación Base64, se muestra un ejemplo de lo fácil que puede ser reveladas las credenciales de usuarios de la Autenticación Básica.

Otra vulnerabilidad consiste en que tampoco posee ningún mecanismo que obligue a realizar la transmisión sobre un canal encriptado.

Por último y no menos grave, la Autenticación Básica no establece un proceso para desconectar al usuario, dejando esto en manos de la implementación del navegador web (user-agent en su concepto más general).

Espero que te haya sido útil la entrada, recuerda que la Autenticación Básica está ahí, pero es totalmente desaconsejable su uso, si vas a usarla es imprescindible que lo hagas sobre un canal encriptado. Recuerda que siempre es preferible emplear algo más de tiempo en desarrollar una autenticación sólida que usar esta.

S4lud0s y h4st4 el próx1m0 p0st!!!

Anuncios

3 comentarios en “¿Por qué la Autenticación Básica de HTTP/1.1 es vulnerable? (+Ejemplo)

  1. Pingback: Base64 y su vulnerable aplicación en el ofuscamiento de credenciales en la Autenticación Básica de HTTP/1.1 (+Ejemplo) | Behique Digital

  2. Pingback: Mis notas de cURL | Behique Digital

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s