Cookies Hacking
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Atributos de Cookies
Las cookies vienen con varios atributos que controlan su comportamiento en el navegador del usuario. Aqu铆 hay un resumen de estos atributos en una voz m谩s pasiva:
Expires y Max-Age
La fecha de caducidad de una cookie se determina por el atributo Expires
. Por el contrario, el atributo Max-age
define el tiempo en segundos hasta que una cookie es eliminada. Opta por Max-age
ya que refleja pr谩cticas m谩s modernas.
Dominio
Los hosts que recibir谩n una cookie se especifican mediante el atributo Domain
. Por defecto, esto se establece en el host que emiti贸 la cookie, sin incluir sus subdominios. Sin embargo, cuando el atributo Domain
se establece expl铆citamente, abarca tambi茅n los subdominios. Esto hace que la especificaci贸n del atributo Domain
sea una opci贸n menos restrictiva, 煤til para escenarios donde compartir cookies entre subdominios es necesario. Por ejemplo, establecer Domain=mozilla.org
hace que las cookies sean accesibles en sus subdominios como developer.mozilla.org
.
Ruta
Un camino de URL espec铆fico que debe estar presente en la URL solicitada para que se env铆e el encabezado Cookie
es indicado por el atributo Path
. Este atributo considera el car谩cter /
como un separador de directorios, permitiendo coincidencias en subdirectorios tambi茅n.
Reglas de Ordenaci贸n
Cuando dos cookies tienen el mismo nombre, la que se elige para enviar se basa en:
- La cookie que coincide con la ruta m谩s larga en la URL solicitada.
- La cookie establecida m谩s recientemente si las rutas son id茅nticas.
SameSite
- El atributo
SameSite
dicta si las cookies se env铆an en solicitudes que provienen de dominios de terceros. Ofrece tres configuraciones: - Strict: Restringe el env铆o de la cookie en solicitudes de terceros.
- Lax: Permite que la cookie se env铆e con solicitudes GET iniciadas por sitios web de terceros.
- None: Permite que la cookie se env铆e desde cualquier dominio de terceros.
Recuerda, al configurar cookies, entender estos atributos puede ayudar a garantizar que se comporten como se espera en diferentes escenarios.
Tipo de Solicitud | C贸digo de Ejemplo | Cookies Enviadas Cuando |
---|---|---|
Enlace | <a href="..."></a> | NotSet*, Lax, None |
Prerender | <link rel="prerender" href=".."/> | NotSet*, Lax, None |
Formulario GET | <form method="GET" action="..."> | NotSet*, Lax, None |
Formulario POST | <form method="POST" action="..."> | NotSet*, None |
iframe | <iframe src="..."></iframe> | NotSet*, None |
AJAX | $.get("...") | NotSet*, None |
Imagen | <img src="..."> | NetSet*, None |
Tabla de Invicti y ligeramente modificada.
Una cookie con el atributo SameSite mitigar谩 ataques CSRF donde se necesita una sesi贸n iniciada.
*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo SameSite ser谩 lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Ten en cuenta que temporalmente, despu茅s de aplicar este cambio, las cookies sin una pol铆tica SameSite en Chrome ser谩n tratadas como None durante los primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios.
Banderas de Cookies
HttpOnly
Esto evita que el cliente acceda a la cookie (a trav茅s de Javascript, por ejemplo: document.cookie
)
Evasiones
- Si la p谩gina est谩 enviando las cookies como respuesta a una solicitud (por ejemplo, en una p谩gina PHPinfo), es posible abusar de la XSS para enviar una solicitud a esta p谩gina y robar las cookies de la respuesta (ver un ejemplo en https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
- Esto podr铆a ser evadido con solicitudes TRACE HTTP ya que la respuesta del servidor (si este m茅todo HTTP est谩 disponible) reflejar谩 las cookies enviadas. Esta t茅cnica se llama Cross-Site Tracking.
- Esta t茅cnica es evitada por navegadores modernos al no permitir el env铆o de una solicitud TRACE desde JS. Sin embargo, se han encontrado algunas evasiones en software espec铆fico como enviar
\r\nTRACE
en lugar deTRACE
a IE6.0 SP2. - Otra forma es la explotaci贸n de vulnerabilidades de d铆a cero en los navegadores.
- Es posible sobrescribir cookies HttpOnly realizando un ataque de desbordamiento de Cookie Jar:
- Es posible usar el ataque de Cookie Smuggling para exfiltrar estas cookies.
Seguro
La solicitud solo enviar谩 la cookie en una solicitud HTTP solo si la solicitud se transmite a trav茅s de un canal seguro (t铆picamente HTTPS).
Prefijos de Cookies
Las cookies con el prefijo __Secure-
deben establecerse junto con la bandera secure
de p谩ginas que est谩n aseguradas por HTTPS.
Para las cookies con el prefijo __Host-
, deben cumplirse varias condiciones:
- Deben establecerse con la bandera
secure
. - Deben originarse de una p谩gina asegurada por HTTPS.
- Se les proh铆be especificar un dominio, impidiendo su transmisi贸n a subdominios.
- La ruta para estas cookies debe establecerse en
/
.
Es importante notar que las cookies con el prefijo __Host-
no pueden ser enviadas a superdominios o subdominios. Esta restricci贸n ayuda a aislar las cookies de la aplicaci贸n. Por lo tanto, emplear el prefijo __Host-
para todas las cookies de la aplicaci贸n puede considerarse una buena pr谩ctica para mejorar la seguridad y el aislamiento.
Sobrescribiendo cookies
As铆, una de las protecciones de las cookies con prefijo __Host-
es prevenir que sean sobrescritas desde subdominios. Previniendo, por ejemplo, ataques de Cookie Tossing. En la charla Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (paper) se presenta que era posible establecer cookies con prefijo __HOST- desde un subdominio, enga帽ando al parser, por ejemplo, a帽adiendo "=" al principio o al final...:
O en PHP era posible a帽adir otros caracteres al principio del nombre de la cookie que iban a ser reemplazados por caracteres de subrayado, permitiendo sobrescribir cookies __HOST-
:
Ataques de Cookies
Si una cookie personalizada contiene datos sensibles, rev铆sala (especialmente si est谩s participando en un CTF), ya que podr铆a ser vulnerable.
Decodificaci贸n y Manipulaci贸n de Cookies
Los datos sensibles incrustados en las cookies siempre deben ser examinados. Las cookies codificadas en Base64 o formatos similares a menudo pueden ser decodificadas. Esta vulnerabilidad permite a los atacantes alterar el contenido de la cookie e impersonar a otros usuarios codificando sus datos modificados de nuevo en la cookie.
Secuestro de Sesi贸n
Este ataque implica robar la cookie de un usuario para obtener acceso no autorizado a su cuenta dentro de una aplicaci贸n. Al usar la cookie robada, un atacante puede hacerse pasar por el usuario leg铆timo.
Fijaci贸n de Sesi贸n
En este escenario, un atacante enga帽a a una v铆ctima para que use una cookie espec铆fica para iniciar sesi贸n. Si la aplicaci贸n no asigna una nueva cookie al iniciar sesi贸n, el atacante, poseyendo la cookie original, puede hacerse pasar por la v铆ctima. Esta t茅cnica se basa en que la v铆ctima inicie sesi贸n con una cookie proporcionada por el atacante.
Si encontraste un XSS en un subdominio o controlas un subdominio, lee:
Donaci贸n de Sesi贸n
Aqu铆, el atacante convence a la v铆ctima para que use la cookie de sesi贸n del atacante. La v铆ctima, creyendo que ha iniciado sesi贸n en su propia cuenta, realizar谩 inadvertidamente acciones en el contexto de la cuenta del atacante.
Si encontraste un XSS en un subdominio o controlas un subdominio, lee:
Cookies JWT
Haz clic en el enlace anterior para acceder a una p谩gina que explica posibles fallas en JWT.
Los JSON Web Tokens (JWT) utilizados en cookies tambi茅n pueden presentar vulnerabilidades. Para obtener informaci贸n detallada sobre posibles fallas y c贸mo explotarlas, se recomienda acceder al documento vinculado sobre el hacking de JWT.
Cross-Site Request Forgery (CSRF)
Este ataque obliga a un usuario autenticado a ejecutar acciones no deseadas en una aplicaci贸n web en la que actualmente est谩 autenticado. Los atacantes pueden explotar cookies que se env铆an autom谩ticamente con cada solicitud al sitio vulnerable.
Cookies Vac铆as
(Revisa m谩s detalles en la investigaci贸n original) Los navegadores permiten la creaci贸n de cookies sin un nombre, lo que se puede demostrar a trav茅s de JavaScript de la siguiente manera:
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
El resultado en el encabezado de la cookie enviada es a=v1; test value; b=v2;
. Intrigantemente, esto permite la manipulaci贸n de cookies si se establece una cookie con un nombre vac铆o, potencialmente controlando otras cookies al establecer la cookie vac铆a a un valor espec铆fico:
function setCookie(name, value) {
document.cookie = `${name}=${value}`
}
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
Esto lleva a que el navegador env铆e un encabezado de cookie interpretado por cada servidor web como una cookie llamada a
con un valor b
.
Error de Chrome: Problema de C贸digo de Sustituci贸n Unicode
En Chrome, si un c贸digo de sustituci贸n Unicode es parte de una cookie establecida, document.cookie
se corrompe, devolviendo una cadena vac铆a posteriormente:
document.cookie = "\ud800=meep"
Esto resulta en que document.cookie
devuelve una cadena vac铆a, lo que indica una corrupci贸n permanente.
Robo de Cookies Debido a Problemas de An谩lisis
(Revisa m谩s detalles en lainvestigaci贸n original) Varios servidores web, incluidos los de Java (Jetty, TomCat, Undertow) y Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), manejan incorrectamente las cadenas de cookies debido al soporte obsoleto de RFC2965. Lee un valor de cookie entre comillas dobles como un solo valor, incluso si incluye punto y coma, que normalmente deber铆a separar pares clave-valor:
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
Vulnerabilidades de Inyecci贸n de Cookies
(Revisa m谩s detalles en la investigaci贸n original) El an谩lisis incorrecto de cookies por parte de los servidores, notablemente Undertow, Zope y aquellos que utilizan http.cookie.SimpleCookie
y http.cookie.BaseCookie
de Python, crea oportunidades para ataques de inyecci贸n de cookies. Estos servidores no delimitan correctamente el inicio de nuevas cookies, permitiendo a los atacantes suplantar cookies:
- Undertow espera una nueva cookie inmediatamente despu茅s de un valor entre comillas sin un punto y coma.
- Zope busca una coma para comenzar a analizar la siguiente cookie.
- Las clases de cookies de Python comienzan a analizar en un car谩cter de espacio.
Esta vulnerabilidad es particularmente peligrosa en aplicaciones web que dependen de la protecci贸n CSRF basada en cookies, ya que permite a los atacantes inyectar cookies de token CSRF suplantadas, potencialmente eludiendo medidas de seguridad. El problema se agrava por el manejo de nombres de cookies duplicados en Python, donde la 煤ltima ocurrencia anula las anteriores. Tambi茅n plantea preocupaciones para las cookies __Secure-
y __Host-
en contextos inseguros y podr铆a llevar a eludir autorizaciones cuando las cookies se pasan a servidores backend susceptibles a suplantaci贸n.
Cookies $version y elusi贸n de WAF
Seg煤n este blog, podr铆a ser posible usar el atributo de cookie $Version=1
para hacer que el backend utilice una l贸gica antigua para analizar la cookie debido a la RFC2109. Adem谩s, otros valores como $Domain
y $Path
pueden ser utilizados para modificar el comportamiento del backend con la cookie.
An谩lisis de elusi贸n de valores con codificaci贸n de cadena entre comillas
Este an谩lisis indica deshacer los valores escapados dentro de las cookies, por lo que "\a" se convierte en "a". Esto puede ser 煤til para eludir WAFS ya que:
eval('test') => prohibido
"\e\v\a\l\(\'\t\e\s\t\'\)" => permitido
Elusi贸n de listas de bloqueo de nombres de cookies
En la RFC2109 se indica que una coma puede ser utilizada como separador entre valores de cookies. Y tambi茅n es posible agregar espacios y tabulaciones antes y despu茅s del signo igual. Por lo tanto, una cookie como $Version=1; foo=bar, abc = qux
no genera la cookie "foo":"bar, admin = qux"
sino las cookies foo":"bar"
y "admin":"qux"
. Nota c贸mo se generan 2 cookies y c贸mo se elimin贸 el espacio antes y despu茅s del signo igual.
An谩lisis de elusi贸n de valores con divisi贸n de cookies
Finalmente, diferentes puertas traseras se unir铆an en una cadena diferentes cookies pasadas en diferentes encabezados de cookies como en:
GET / HTTP/1.1
Host: example.com
Cookie: param1=value1;
Cookie: param2=value2;
Lo que podr铆a permitir eludir un WAF como en este ejemplo:
Cookie: name=eval('test//
Cookie: comment')
Resulting cookie: name=eval('test//, comment') => allowed
Comprobaciones de Cookies Extra Vulnerables
Comprobaciones b谩sicas
- La cookie es la misma cada vez que inicias sesi贸n.
- Cierra sesi贸n e intenta usar la misma cookie.
- Intenta iniciar sesi贸n con 2 dispositivos (o navegadores) en la misma cuenta usando la misma cookie.
- Verifica si la cookie tiene alguna informaci贸n y trata de modificarla.
- Intenta crear varias cuentas con nombres de usuario casi id茅nticos y verifica si puedes ver similitudes.
- Revisa la opci贸n de "recordarme" si existe para ver c贸mo funciona. Si existe y podr铆a ser vulnerable, siempre usa la cookie de recordarme sin ninguna otra cookie.
- Verifica si la cookie anterior funciona incluso despu茅s de cambiar la contrase帽a.
Ataques avanzados a cookies
Si la cookie permanece igual (o casi) cuando inicias sesi贸n, esto probablemente significa que la cookie est谩 relacionada con alg煤n campo de tu cuenta (probablemente el nombre de usuario). Entonces puedes:
- Intentar crear muchas cuentas con nombres de usuario muy similares y tratar de adivinar c贸mo est谩 funcionando el algoritmo.
- Intentar fuerza bruta al nombre de usuario. Si la cookie se guarda solo como un m茅todo de autenticaci贸n para tu nombre de usuario, entonces puedes crear una cuenta con el nombre de usuario "Bmin" y fuerza bruta cada bit de tu cookie porque una de las cookies que intentar谩s ser谩 la que pertenece a "admin".
- Intentar Padding Oracle (puedes descifrar el contenido de la cookie). Usa padbuster.
Padding Oracle - Ejemplos de Padbuster
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf
# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
Padbuster har谩 varios intentos y te preguntar谩 cu谩l es la condici贸n de error (la que no es v谩lida).
Luego comenzar谩 a descifrar la cookie (puede tardar varios minutos).
Si el ataque se ha realizado con 茅xito, entonces podr铆as intentar cifrar una cadena de tu elecci贸n. Por ejemplo, si quisieras encrypt user=administrator.
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
Esta ejecuci贸n te dar谩 la cookie correctamente cifrada y codificada con la cadena user=administrator dentro.
CBC-MAC
Tal vez una cookie podr铆a tener alg煤n valor y podr铆a ser firmada usando CBC. Entonces, la integridad del valor es la firma creada utilizando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificaci贸n de integridad podr铆a ser vulnerable.
El ataque
- Obtener la firma del nombre de usuario administ = t
- Obtener la firma del nombre de usuario rator\x00\x00\x00 XOR t = t'
- Establecer en la cookie el valor administrator+t' (t' ser谩 una firma v谩lida de (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00
ECB
Si la cookie est谩 cifrada usando ECB podr铆a ser vulnerable.
Cuando inicias sesi贸n, la cookie que recibes tiene que ser siempre la misma.
C贸mo detectar y atacar:
Crea 2 usuarios con datos casi id茅nticos (nombre de usuario, contrase帽a, correo electr贸nico, etc.) y trata de descubrir alg煤n patr贸n dentro de la cookie dada.
Crea un usuario llamado, por ejemplo, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" y verifica si hay alg煤n patr贸n en la cookie (como ECB cifra con la misma clave cada bloque, los mismos bytes cifrados podr铆an aparecer si el nombre de usuario es cifrado).
Deber铆a haber un patr贸n (con el tama帽o de un bloque utilizado). As铆 que, sabiendo c贸mo se cifran un mont贸n de "a", puedes crear un nombre de usuario: "a"*(tama帽o del bloque)+"admin". Luego, podr铆as eliminar el patr贸n cifrado de un bloque de "a" de la cookie. Y tendr谩s la cookie del nombre de usuario "admin".
Referencias
- https://blog.ankursundara.com/cookie-bugs/
- https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd
- https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.