Cómo funciona esta web
Una explicación corta de la arquitectura de la demo, para que entiendas qué estás tocando cuando atacás.
Que es
Notas es una aplicación web chica para guardar notas privadas. Cada usuario se registra, inicia sesión y guarda sus notas. La promesa es simple: solo el dueño ve sus notas. La demo existe para mostrar cómo, sin las defensas correctas, esa promesa se rompe.
Con que esta hecha
- Backend: Node.js + Express (servidor web y rutas).
- Vistas: plantillas EJS renderizadas en el servidor (sin framework de frontend).
- Base de datos: SQLite en memoria (
node:sqlite). Es efímera: se borra al reiniciar, por eso los datos son descartables. - Sesiones: al iniciar sesión se crea un identificador de sesión (
sid) que viaja en una cookie. - Tiempo real: Server-Sent Events para el panel de loot y el buzon de mails.
- Despliegue: contenedor Docker endurecido detras de un reverse proxy (Caddy) que pone HTTPS.
El interruptor de modo (lo mas importante)
Toda la app comparte un modo global que controla el presentador desde /admin (con PIN):
| Modo VULNERABLE | Modo SEGURO | |
|---|---|---|
| Cookie de sesión | legible por JavaScript | HttpOnly; Secure; SameSite |
| Salida HTML | sin escapar | escapada + CSP con nonce |
| Consultas SQL | concatenando texto | parametrizadas |
| Control de acceso | no verifica dueño | verifica propiedad (deny by default) |
| Login | sin limite de intentos | bloqueo tras 5 intentos |
| Errores | muestran el stack trace | mensaje generico |
El mismo ataque que funciona en VULNERABLE deja de funcionar en SEGURO. Esa comparacion es el corazon de la demo.
Las dos superficies
La demo separa a proposito lo que ve un usuario comun de lo que ve el atacante/presentador:
- La app "Notas" (pública):
/landing,/registro,/login,/notasy/buscar(visible en el header cuando estás logueado). Se ve como una app normal, sin ninguna pista de que es vulnerable. Es lo que ve la víctima. - El centro de control (oculto):
/admin. Ahí están el panel de ataque (enlace trampa + loot en vivo + secuestro de sesión) y el interruptor de modo. También se llega a/modulos,/slidesy esta página.
El enlace de ataque apunta al buscador de la app (/buscar), por eso la victima no sospecha nada.