Las cookies HTTP suelen controlar funciones críticas de los sitios web, pero su largo y complicado historial las expone a vulnerabilidades de discrepancia de analizadores. En esta publicación, exploraré algunas características peligrosas y menos conocidas de los analizadores de cookies modernos y mostraré cómo se pueden utilizar de forma abusiva para eludir los firewalls de aplicaciones web. Esta es la primera parte de una serie de publicaciones de blog sobre el análisis de cookies.
Degradación de analizadores de cookies con $Version
Se han hecho muchos intentos de estandarizar las cookies HTTP, comenzando con el primer estándar oficial: RFC2109 . Aunque los navegadores modernos no son compatibles con las RFC antiguas, muchos servidores web aún lo son. A continuación, se muestra un ejemplo de encabezado de cookie válido :
Cookie: $Version=1; foo="bar"; $Path="/"; $Domain=abc;
$Version es un atributo obligatorio que identifica la versión de la especificación de administración de estado a la que se ajusta la cookie. Otros atributos interesantes son $Domain y $Path , que analizaremos más adelante. Según el estándar, un valor de cookie puede incluir caracteres especiales como espacios, punto y coma y signos de igual si están entre comillas dobles:
Muchos valores de campos de encabezado HTTP/1.1 consisten en palabras separadas por LWS (espacio en blanco lineal) o caracteres especiales. Estos caracteres especiales DEBEN estar en una cadena entre comillas para poder usarse dentro de un valor de parámetro. - RFC 2068 .
Los marcos modernos analizan ese encabezado de las siguientes maneras:
Flask: {"foo":"bar","$Version":"1","$Path":"/","$Domain":"abc"}
Django: {"foo":"bar","$Version":"1","$Path":"/","$Domain":"abc"}
PHP: {"foo":"\"bar\"","$Version":"1","$Path":"\"\/\"","$Domain":"abc"}
Ruby: {"foo":"\"bar\"","$Version":"1","$Path":"\"\/\"","$Domain":"abc"}
Spring: { "foo": "\"bar\""}
SimpleCookie: { "foo": "bar"}
Como podemos ver, los resultados son confusos. Este desorden nos da la oportunidad de buscar debilidades de seguridad. Centrémonos primero en Spring Boot Starter Web 2.xx. Utiliza Apache Tomcat v. 9.0.83 de forma predeterminada, que procesa los encabezados de cookies de las siguientes formas:
- Maneja los estándares RFC6265 y RFC2109, y utiliza de manera predeterminada la lógica de análisis heredada si una cadena comienza con el atributo especial $Version .
- También admite los atributos $Path y $Domain , que pueden permitir a los usuarios cambiar los atributos de cookies reflejados si no se verifican correctamente antes de responder.
- El analizador también anulará el escape de cualquier carácter que comience con una barra invertida ( \ ), como se muestra en el siguiente ejemplo.
Una solución de monitoreo de infraestructura extensible a nivel empresarial con funciones que ahorran tiempo y son fáciles de usar.
Conocer …
Cookie: $Version=1; foo="\b\a\r"; $Path=/abc; $Domain=example.com =>
Set-Cookie: foo="bar"; Path=/abc; Domain=example.com
Otro buen ejemplo es el analizador SimpleCookie de Python, que admite atributos de solicitud de cookies heredados cuando van seguidos de pares clave-valor. Esto permite la inyección de atributos de cookies maliciosos de la misma manera que se demostró anteriormente. Todos los marcos basados en Python (Flask, Django, etc.) permiten valores de cookies entre comillas, pero no reconocen las cadenas mágicas, como $Version , y las tratan como un nombre de cookie normal. También decodifican automáticamente secuencias de escape octales dentro de cadenas entre comillas de la siguiente manera:
Escaneo DAST automatizado sin límites. Basado en la tecnología Burp en la que sus equipos de seguridad ya confían.
Conocer …
Cualquier carácter que no sea texto se traduce en una secuencia de 4 caracteres: una barra diagonal seguida del equivalente octal de tres dígitos del carácter. - Cookies.py
Por ejemplo:
"\012" <=> \n
"\015" <=> \r
"\073" <=> ;
Evitar los firewalls de aplicaciones web (WAF)
Muchos WAF no están equipados para detectar las técnicas descritas anteriormente, lo que permite que cargas útiles maliciosas queden ocultas dentro de cadenas entre comillas.
Cómo omitir el análisis de valores con codificación de cadenas entre comillas
Además, las cookies entre comillas pueden facilitar vulnerabilidades de inyección, como la inyección SQL o la inyección de comandos. Estos tipos de ataques suelen utilizar separadores de comandos especiales, como punto y coma ( ; ), comas ( , ), caracteres de nueva línea ( \n ) y barras invertidas ( \ ). Si bien normalmente están restringidos en los valores de las cookies, a veces se pueden manipular para activar vulnerabilidades. La implementación de este tipo de codificación de cookies entre comillas se puede lograr fácilmente utilizando una extensión de Burp Suite con la interfaz HttpHandler:
def handleHttpRequestToBeSent(requestToBeSent):
result = "$Version=1; "
for param in requestToBeSent.parameters:
result += f"{param.name}=\""
for char in param.value:
result += f"\\{char}"
result += "\"; "
return continueWith(requestToBeSent.withAddedHeader("Cookie",result))
Por ejemplo, el WAF de Amazon Web Services bloquea cualquier solicitud que contenga algún parámetro dentro de una función no permitida:
eval() => allowed
eval('test') => forbidden
"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed
"\145\166\141\154\050\047\164\145\163\164\047\051" => allowed
Cómo eludir las listas de bloqueo de nombres de cookies
Otro aspecto crucial de RFC2109: un servidor también debe aceptar una coma ( , ) como separador entre los valores de las cookies. Esto se puede aprovechar para evitar firmas WAF simples que pueden no anticipar que se oculta un nombre de cookie dentro del valor. Además, la especificación permite cualquier número de espacios o caracteres de tabulación antes o después del signo igual en un par atributo-valor inyectado, lo que también se podría utilizar para evitar la detección. Considere el ejemplo del encabezado de Cookie:
$Version=1; foo=bar, abc = qux => "abc": "qux"
Cómo eludir el análisis de valor mediante la división de cookies
Al igual que muchos otros encabezados HTTP, el encabezado Cookie se puede enviar varias veces en una sola solicitud. La forma en que un servidor maneja varios encabezados idénticos puede variar. Por ejemplo, envié la siguiente solicitud GET:
GET / HTTP/1.1
Host: example.com
Cookie: param1=value1;
Cookie: param2=value2;
Y obtuve lo siguiente:
Flask: { "param1": "value1", ",param2": "value2"}
Django: { "param1": "value1", ",param2": "value2"}
PHP: { "param1": "value1", ",_param2": "value2"}
Ruby: { "param1": "value1", ", param2": "value2"}
Spring: { "param1": "value1", "param2": "value2"}
Como podemos ver, Ruby, PHP y los frameworks de Python Django y Flask combinan los encabezados en una única cadena separada por comas (con un espacio opcional entre los parámetros). También se admiten valores de cookies entrecomillados, lo que permite ocultar cargas maliciosas mediante el uso del encabezado de cookies como continuación de encabezado de varias líneas.
Lamentablemente, la técnica de cadenas entre comillas no funciona con PHP y Ruby. Para omitir las firmas de AWS mencionadas, puede utilizar la siguiente solicitud:
Cookie: name=eval('test') => forbidden
Cookie: name=eval('test//
Cookie: comment')
Resulting cookie: name=eval('test//, comment') => allowed
Automatización mediante extensiones Burp
Hemos implementado lo mejor de estas técnicas en Param Miner para usted:


Prevención de vulnerabilidades
Puede tomar una serie de medidas para evitar vulnerabilidades de discrepancia del analizador en las cookies, como se indica a continuación:
- Asegúrese de que el soporte heredado para RFC2109 esté deshabilitado en el servidor web a menos que se requiera explícitamente.
- Valide rigurosamente todas las entradas de los usuarios para identificar y mitigar los datos potencialmente peligrosos. Esto ayuda a garantizar que las entradas sean seguras para su procesamiento dentro de la aplicación o al interactuar con otros componentes del sistema.
- Evite confiar en suposiciones sobre la presencia o ausencia de caracteres específicos en las entradas del usuario para reducir el riesgo de un comportamiento inesperado.
¿Quieres saber más?
Esta publicación del blog es solo la primera parte de nuestra exploración de la lógica de análisis de cookies. En la próxima publicación, veremos cómo se pueden aplicar estas técnicas en situaciones del mundo real para aumentar las vulnerabilidades.
Para conocer nuestras últimas publicaciones de blog y conocimientos de seguridad, síganos en X (anteriormente Twitter) y Linkedin.
NORTH NETWORKS es Distribuidor Oficial y brinda licencias nuevas, renovaciones y servicios profesionales de las herramientas mas importantes.
Pongase en contacto y le ayudaremos a analizar sus necesidades para poder brindarle la herramienta que mejor se ajuste a sus requerimientos.
Si te ha gustado, ¡compártelo con tus amigos!




