
Este es un escáner de CVE-2025-29927.
Este es un escáner de nivel profesional diseñado para detectar la vulnerabilidad de omisión de middleware CVE-2025-29927 en aplicaciones Next.js.
X-Middleware-Subrequest manipulados para omitir el middleware de Next.jspip install -r requirements.txt playwright install
### Ejecutar el escáner```bash
python main.py --domain https://example.com --threads 10 --timeout 10 --save
python main.py --help
| Opción | Descripción |
|----------------|----------------------------------------------------|
| `--domain` | URL base del sitio objetivo (obligatorio) |
| `--user-agent` | User-agent personalizado (predeterminado: cadena de Chrome) |
| `--timeout` | Tiempo de espera de la solicitud (predeterminado: 10 segundos) |
| `--proxy` | Dirección del proxy (opcional) |
| `--save` | Guardar resultados en `results.txt` |
| `--threads` | Número de hilos (predeterminado: 10) |
| `--wordlist` | Lista de palabras incluye rutas comunes |
---
## 🐳 Uso de Docker
### Construir imagen de Docker```bash
docker build -t cve-scanner .
docker run -it --rm cve-scanner --domain https://example.com --save
---
## ⚙️ GitHub Actions
Este proyecto incluye un flujo de trabajo de GitHub Actions para probar la configuración en cada push. Dicho flujo:
- Instala las dependencias
- Instala los navegadores de Playwright
- Ejecuta una comprobación de `--help`
Consulta `.github/workflows/python.yml`.
---
## 🧱 Estructura```
.
├── main.py # Entry point
├── config.py # CLI parser
├── crawler.py # Playwright crawler
├── scanner.py # Multi-threaded vulnerability testing
├── requirements.txt
├── Dockerfile
└── .github/workflows
Resumen de la vulnerabilidad CVE-2025-29927
CVE-2025-29927 es una falla de seguridad crítica en Next.js que permite a los atacantes eludir la autenticación y la autorización basadas en middleware. Al incluir un encabezado interno especial (X-Middleware-Subrequest) en las solicitudes HTTP, un atacante puede engañar al servidor Next.js para que omita la ejecución del middleware, obteniendo así acceso a rutas protegidas. En la práctica, una solicitud que normalmente sería bloqueada por el middleware de autenticación (por ejemplo, devolviendo un 401/403 o redirigiendo al inicio de sesión) se procesa normalmente si este encabezado está presente, eludiendo eficazmente los controles de seguridad. Esta vulnerabilidad afecta a las versiones de Next.js 11.1.4 a 15.2.2, y se insta a los administradores a aplicar parches o implementar mitigaciones (como eliminar este encabezado en los proxies) para proteger sus aplicaciones.
Detectar esta vulnerabilidad en una aplicación web requiere descubrir los endpoints internos y probarlos con el encabezado malicioso para ver si es posible el acceso no autorizado. A continuación se presenta un plan de diseño para un script avanzado en Python que rastreará un sitio web objetivo (con soporte completo de JavaScript) y escaneará en busca de CVE-2025-29927, cumpliendo todos los requisitos especificados.
Para cumplir con el requisito de un rastreo profundo que incluya contenido renderizado por JavaScript, usaremos Playwright (preferido sobre Selenium por su velocidad y su API moderna). Playwright es una potente librería de automatización de navegadores headless que puede manejar aplicaciones web dinámicas y frameworks JS modernos. En comparación con Selenium, Playwright ofrece una API más moderna (construida sobre el Chrome DevTools Protocol) y admite operación tanto síncrona como asíncrona, lo que puede ofrecer un mejor rendimiento para nuestro caso de uso. Las librerías clave y sus instrucciones de instalación incluyen:
playwright – para la automatización de navegadores headless (para cargar SPAs o páginas que requieren JS). (Instalación: pip install playwright y ejecutar playwright install para obtener los binarios del navegador).
requests o httpx – para enviar solicitudes HTTP durante la fase de escaneo. Podemos usar requests por simplicidad o httpx/aiohttp para soporte asíncrono. (Instalación: pip install requests o pip install httpx).
bs4 (BeautifulSoup) – para parsear HTML y extraer enlaces cuando sea necesario. Playwright puede consultar el DOM directamente, pero usar BeautifulSoup sobre el contenido HTML de la página es sencillo para encontrar etiquetas de anclaje. (Instalación: pip install beautifulsoup4).
concurrent.futures (integrado) o asyncio – para implementar concurrencia. Para el multihilo, se usará concurrent.futures.ThreadPoolExecutor de Python (sin instalación adicional). Si se usa un enfoque asíncrono, se puede usar asyncio de Python con httpx para solicitudes en paralelo.
(Opcional) argparse – para parsear argumentos de línea de comandos si queremos una interfaz CLI en lugar de un menú interactivo. (módulo integrado)
(Opcional) rich o colorama – para salida de consola con colores o formato, para mejorar la legibilidad. (Instalación: pip install rich o pip install colorama).
Justificación: Playwright se elige por su capacidad para scrapear contenido dinámico sin complejidades pesadas. “Con Playwright podemos automatizar navegadores headless... para navegar por la web igual que un humano, lo que lo hace excelente para scrapear sitios web dinámicos impulsados por JavaScript”. Esto garantiza que nuestro rastreador pueda ver enlaces o elementos de interfaz que son generados por scripts (que un rastreador simple basado en requests pasaría por alto).
El módulo rastreador usará Playwright en modo headless para realizar un rastreo profundo del sitio objetivo. El objetivo es descubrir rutas internas (endpoints) para probar, incluidas aquellas que solo se revelan después de la ejecución de JS. Puntos clave de diseño del rastreador:
Navegación con navegador headless: Lanzar una instancia de navegador (por ejemplo, Chromium) en modo headless a través de Playwright. Usar un Browser Context con un User-Agent personalizado si el usuario lo especifica (más sobre esto en la siguiente sección). Por ejemplo, podemos crear un contexto con browser.new_context(user_agent=<user_agent_string>) para emular el User-Agent elegido. Si hay un proxy configurado, aplicarlo al lanzar (Playwright permite configurar un servidor proxy al lanzar el navegador o el contexto).