CORS Abierto en API Routes de Next.js
Las API routes de Next.js configuradas con Access-Control-Allow-Origin: * permiten a cualquier sitio web hacer requests cross-origin autenticados, habilitando ataques tipo CSRF.
Cómo Funciona
Cuando las API routes configuran Access-Control-Allow-Origin a *, cualquier sitio web puede hacer requests a tu API desde el navegador del usuario. Si la API también permite credenciales (cookies), el sitio de un atacante puede hacer requests autenticados en nombre de usuarios logueados. Esto habilita robo de datos cross-site: el atacante hostea una página maliciosa que hace fetch de datos de tu API usando las cookies de sesión de la víctima. Incluso sin credenciales, CORS abierto expone respuestas de la API a cualquier origen, filtrando datos que solo deberían ser accesibles desde tu frontend.
// pages/api/user/profile.ts
export default function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', '*');
const user = await getUser(req);
res.json(user);
}// pages/api/user/profile.ts
const ALLOWED_ORIGINS = [process.env.NEXT_PUBLIC_APP_URL];
export default function handler(req, res) {
const origin = req.headers.origin;
if (ALLOWED_ORIGINS.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
const user = await getUser(req);
res.json(user);
}Ejemplo Real
En 2019, una política CORS mal configurada en una API bancaria permitió a investigadores demostrar exfiltración de datos cross-origin de balances de cuentas e historial de transacciones hosteando una página proof-of-concept en un dominio controlado por el atacante.
Cómo Prevenirlo
- Nunca uses Access-Control-Allow-Origin: * en API routes autenticadas
- Valida el header Origin contra un allowlist de dominios de confianza
- Evita Access-Control-Allow-Credentials: true con orígenes wildcard
- Usa middleware de Next.js para centralizar la configuración CORS
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
dangerouslySetInnerHTML Sin Sanitización
highUsar dangerouslySetInnerHTML de React con input de usuario sin sanitizar permite a atacantes inyectar scripts maliciosos que se ejecutan en los navegadores de otros usuarios.
Tokens de Autenticación en localStorage
highGuardar JWT tokens, tokens de sesión o API keys en localStorage los hace accesibles a cualquier JavaScript corriendo en la página, incluyendo payloads XSS.
Exposición de Secretos en __NEXT_DATA__
highLos props de página de Next.js pasados por getServerSideProps o getStaticProps filtran datos sensibles como API keys, URLs de base de datos o configuración interna a través del script tag __NEXT_DATA__.
Source Maps Expuestos en Producción
mediumLos archivos source map de JavaScript (.map) son públicamente accesibles en producción, revelando el código fuente original completo incluyendo comentarios, nombres de variables y lógica interna.