Kategoriak: All - sesiones - seguridad - soluciones - ataques

arabera Manuel Jesús González Gallardo 3 years ago

245

Organigrama arbol

La gestión de sesiones web es crucial para mantener la seguridad en las aplicaciones en línea, ya que permite identificar y autenticar a los usuarios a través de cookies que contienen identificadores de sesión únicos.

Organigrama arbol

GESTIÓN DE SESIONES WEB

FUENTES DE INFORMACIÓN

Oracle: HttpSession
Microsoft: ASP.NET Session State Overview
BlackHat: SAP: Session (Fixation) Attacks and Protections
Security Art Work: Vulnerabilidad de fijación de sesión: PoC (II)
PHP: Sesiones
OWASP: Session Management Cheat Sheet

CONCLUSIONES

Dada la complejidad de la gestión de sesiones web, es recomendable utilizar un framework o librería antes que realizar un desarrollo propio para la gestión de sesiones web.
Es posible evitar estos ataques mediante sencillas medidas de seguridad, cuya implantación debe estar supeditada al perfil de riesgo del portal web.
Existen varios ataques que permiten obtener un identificador de sesión válido y, por tanto, suplantar a la víctima en el portal web.
La gestión de sesiones web se basa en la inclusión de cookies en las peticiones y respuestas HTTP/HTTPS que contienen el identificador de sesión.

CONFIGURACIÓN SEGURA EN FRAMEWORKS WEB

JAVA

Se debe invalidar la sesión y eliminar las cookies del cliente.

Se puede encontrar un ejemplo de código en la web de OWASP

La cookie usada por defecto, JSESSIONID, es no persistente.

En otras cookies se puede controlar a través del método setMaxAge.

Se puede utilizar la función getCreationTime, que devuelve el tiempo de creación de sesión, para establecer un tiempo máximo de sesión activa.

Se estable en la opción session-timeout del fichero web.xml

15 ...

Se controla mediante la opción secure del apartado cookie-config de web.xml:

Se controla mediante la opción security-constraint del archivo web.xml.

... CONFIDENTIAL ...

En el código fuente de la página se puede obtener mediante el método RemoteAddr, la dirección IP del usuario, para almacenarla a continuación en la sesión y controlar que no ha cambiado en cada nueva petición web.

Se controla mediante la opción tracking-mode de web.xml.

COOKIE ...

Tampoco existe un método, para renovar el identificador, por lo que se debe finalizar la sesión actual y crear una nueva en el código fuente de la página web.

session.invalidate(); session=request.getSession(true);

Por otro lado, Apache Tomcat incluye una medida de seguridad para evitar los ataques de fijación de sesión, activada por defecto, que consiste en regenerar el identificador si el usuario se autentica.

Configurable en el servidor HTTP. Se puede hacer en el contenedor de Servlets o en el servidor web.

Se configura mediante la opción http-only de web.xml

true ...

La configuración por defecto, de aleatorización del identificador de sesión, es suficientemente buena, aunque en el pasado surgieron estudios de posibles ataques de predicción de sesión.

Al igual que la mayoría de entornos de desarrollo web utiliza un objeto, HttpSession, para almacenar y recuperar la información de la sesión.
ASP.NET

HttpSession session = request.getSession(true); ShoppingCart previousItems = ShoppingCart)session.getValue("previousItems"); session.putValue("referringPage", request.getHeader("Referer"));

En el código fuente de la página web se puede realizar mediante el método Session.Abandon, además hay que invalidar la cookie del navegador del cliente.

No hace falta modificar la configuración ya que la cookie de sesión ASP.NET_SessionId es no persistente.

En el código fuente de la página web se puede utilizar la función DateTime para obtener la hora de inicio de sesión, almacenarla en los datos de sesión y así poder comprobar que no ha vencido el tiempo máximo de validez de sesión en las peticiones siguientes.

Establecer un timeout de sesión

Se establece en la opción de configuración timeout de sessionState. El valor por defecto es 20 minutos.

Utilizar la opción secure en las cookies de sesión

Se activa mediante la opción requireSSL, del apartado httpCookies del archivo de configuración web.config.

Asociar el identificador con información del usuario única, como su dirección IP

Mediante el método Request.UserHostAddress puede obtenerse la dirección del cliente para ser almacenada en la sesión.

Permitir únicamente el identificador en cookies

Esta es la opción por defecto y se controla con la opción cookieless de sessionState.

Renovar el identificador, al autenticarse el usuario, o asignarlo únicamente después de la autenticación.

Otra solución, puede ser utilizar cookies distintas a la cookie de sesión por defecto, ASP.NET_SessionId, que se asignen después de la autenticación y, por tanto, el atacante no pueda conocer.

En ASP.NET no hay una función para renovar el identificador de sesión.

Una posible solución es finalizar la sesión y borrar el contenido de la cookie de sesión, en el formulario de inicio de sesión, para que después de la autenticación se asigne una cookie de sesión nueva.

Este método tiene la desventaja de que se pierde toda la información previa almacenada en la sesión.

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

Deshabilitar el método TRACE

Configurable en el servidor HTTP. En IIS está desactivado por defecto.

Las cookies sólo han de ser accesibles a través del protocolo HTTP

...

Se controla mediante la opción httpOnlyCookies del archivo web.config.

Aunque se puede modificar la generación del identificador, a través de SessionIDManager, la configuración por defecto de la aleatorización del identificador de sesión es suficientemente buena.

Pero al contrario que se hace con PHP, almacena la información de sesión en memoria, aunque puede configurarse para que lo haga, por ejemplo en base de datos o en la memoria de otro proceso.
El funcionamiento es muy similar al de PHP, a través del objeto Session, que gestiona automáticamente el framework, se puede establecer y leer la información de sesión.

Session["Username"] = username; ... var username = Session["Username"];

De los diferentes métodos que ofrece ASP.NET, para almacenar los datos de sesión, este informe describirá el más común: Session state
PHP
Configuración segura

Medidas ante aspectos propios de la implementación de la gestión de sesiones de PHP

Los usuarios no deben ni poder listar los archivos ya que su nombre contiene el identificador de sesión.

En la instalación por defecto, sólo tiene acceso a ese directorio el usuario bajo el que se ejecuta el servidor web.

Restringir el acceso al directorio session.save_path donde se guardan los archivos de sesión sin encriptar.

Medidas contra los errores en el cierre de sesión

Invalidar y no reutilizar los identificadores de sesión

Cuando se destruye la sesión, mediante session.destroy, se elimina el archivo de sesión, por lo que cuando el usuario acceda de nuevo el servidor web no reconocerá la sesión. Otra cosa a tener en cuenta es invocar session_regenerate_id siempre incluyendo el parámetro "$delete_old_session =true" para inutilizar el identificador anterior.

Utilizar cookies no persistentes

El tiempo de validez de la cookie se controla mediante el parámetro session.cookie_lifetime que por defecto es 0, lo que significa que no es persistente.

Por otro lado, por defecto las cookies están restringidas al dominio y directorio raíz del servidor web (opciones controladas mediante session.cookie_domain y session.cookie_path).

Establecer un tiempo máximo de validez de sesión

Este timeout puede ser establecido mediante un código similar al anterior, utilizando el parámetro session.cookie_lifetime, etc.

Establecer un timeout de sesión.

if (!isset($_SESSION['timeout_idle'])) { $_SESSION['timeout_idle'] = time() + ini_get('session.gc_maxlifetime'); } else { if ($_SESSION['timeout_idle'] < time()) { //destroy session } else { $_SESSION['timeout_idle'] = time() + ini_get('session.gc_maxlifetime'); } }

Se puede delegar esta medida de seguridad en el mecanismo de eliminación de archivos de sesión que no han sido accedidos en el tiempo definido por session.gc_maxlifetime, pero entonces habrá que ajustar su ejecución para que no sea aleatoria y para que dependa de una tarea programada.

Medidas contra el eavesdropping

Utilizar la opción secure en las cookies de sesión: activar la opción session.cookie_secure.

Utilizar el protocolo HTTPS

Medidas contra la fijación de sesión

Asociar el identificador a información del usuario única como su dirección IP

Esta medida no tiene por qué limitarse a la dirección IP, se puede establecer un perfil más detallado a través de acciones comunes, patrones de navegación, localización, etc.

La dirección IP, que se puede obtener de la variable $_SERVER['REMOTE_ADDR'], puede almacenarse en los datos de sesión, a través de $_SESSION, y simplemente en cada nueva petición comprobar que no ha cambiado.

Permitir únicamente el identificador en cookies.

Esta restricción, activa por defecto, se controla mediante la variable session.use_only_cookies.

Renovar el identificador al autenticarse el usuario o asignarlo únicamente después de la autenticación.

Utilizar la función session_regenerate_id, siempre con el parámetro "$delete_old_session = true" para que el identificador de la sesión anterior no sea utilizable.

Medidas contra la captura del identificador a través de ataques XSS

Deshabilitar el método TRACE.

Configurable en el servidor HTTP.

Las cookies sólo han de ser accesibles a través del protocolo HTTP.

Activar la opción session.cookie_httponly que se encuentra desactivada por defecto.

Medidas contra la predicción de sesión

Aleatorización y longitud suficiente del identificador de sesión.

La configuración por defecto de aleatorización del identificador de sesión es suficientemente buena, pero se pueden añadir fuentes de datos para la generación del identificador mediante session.entropy_file y session.entropy_length para, por ejemplo, utilizar el API de Windows o el archivo /dev/random en sistemas Unix.

Además, elimina los archivos si no han sido modificados en un tiempo definido por la variable session.gc_maxlifetime.
El mecanismo mediante el cual se pueden almacenar y leer datos de sesión es a través del array $_SESSION, para ello el servidor realiza las siguientes acciones al recibir una petición perteneciente a una sesión:

Procesa el resto de la página PHP que contiene la lógica de la aplicación.

Lee el identificador de sesión (generalmente de una cookie).

«Serializa» el contenido de $_SESSION y lo almacena en el archivo de sesión para su recuperación posterior.

Procesa este archivo y guarda en el array $_SESSION las variables que contiene.

Añade la cookie de sesión a la respuesta.

Busca un archivo en el directorio session.save_path cuyo nombre contiene el identificador.

PHP almacena los datos de cada sesión en un fichero individual bajo el directorio definido por la variable session.save_path

ATAQUES Y MEDIDAS DE SEGURIDAD

ERRORES EN EL CIERRE DE SESIÓN
Solución: Establecer un time out de sesión, establecer un tiempo máximo de validez de sesión, utilizar cookies no persistentes, invalidar los identificadores de sesión y no reutilizar los identificadores de sesión.
Sesiones abiertas olvidadas en el ordenador de la victima
EAVESDROPPING (INTERCEPTANDO LA COMUNICACIÓN)
Solución: Utilizar protocolo HTTPS, cookies en modo secure y asociar el identificador a información del usuarioúnica.
Capturar el identificador de sesión mediante interceptación del trafico.
FIJACIÓN DE SESIÓN
Solución: Renovar el identificador, permitir únicamente el identificador en cookies y asociar el identificador a la información del usuario.
CAPTURA DEL IDENTIFICADOR
Solución: Activar la opción httponly en el servidor web y deshabilitar el método TRACE.
Si una página presenta una vulnerabilidad XSSun atacante puede aprovecharla para ejecutar código que capture el contenido de la cookie y se lo envíe.
PREDICCIÓN DE SESIÓN
Solución: Aleatorización y longitud suficiente del identificador de sesión
Se centra en generar un identificador válido

SESIONES WEB E IDENTIFICADORES DE SESIÓN

En informática, un identificador de sesión o un ID de sesión o un token de sesión es un dato que se utiliza en las comunicaciones de red (a menudo a través de HTTP) para identificar una sesión, una serie de intercambios de mensajes relacionados. Los identificadores de sesión se hacen necesarios en los casos en que la infraestructura de comunicaciones utiliza un protocolo sin estado como el HTTP.

INTRODUCCIÓN

El informe «Gestión de sesiones web: ataques y medidas de seguridad» tiene el objetivo de informar de cómo prevenir los ataques que se pueden realizar sobre la gestión de la sesión de páginas web, como los sufridos en la red social LinkedIn o el ataque que permitía suplantar al usuario en redes sociales.