
Это сканер CVE-2025-29927.
Это профессиональный сканер, предназначенный для обнаружения уязвимости обхода промежуточного ПО CVE-2025-29927 в приложениях Next.js.
X-Middleware-Subrequest для обхода промежуточного ПО Next.jspip install -r requirements.txt playwright install
### Запустите сканер```bash
python main.py --domain https://example.com --threads 10 --timeout 10 --save
python main.py --help
| Опция | Описание |
|-----------------|-------------------------------------------------|
| `--domain` | Базовый URL целевого сайта (обязательно) |
| `--user-agent` | Пользовательский user-agent (по умолчанию: строка Chrome) |
| `--timeout` | Тайм-аут запроса (по умолчанию: 10 секунд) |
| `--proxy` | Адрес прокси (опционально) |
| `--save` | Сохранить результаты в `results.txt` |
| `--threads` | Количество потоков (по умолчанию: 10) |
| `--wordlist` | Словник включает общие пути |
---
## 🐳 Использование Docker
### Сборка Docker-образа```bash
docker build -t cve-scanner .
docker run -it --rm cve-scanner --domain https://example.com --save
---
## ⚙️ GitHub Actions
Этот проект включает рабочий процесс GitHub Actions для проверки установки при пуше. Он:
- Устанавливает зависимости
- Устанавливает браузеры Playwright
- Запускает проверку `--help`
Смотрите `.github/workflows/python.yml`.
---
## 🧱 Структура```
.
├── main.py # Entry point
├── config.py # CLI parser
├── crawler.py # Playwright crawler
├── scanner.py # Multi-threaded vulnerability testing
├── requirements.txt
├── Dockerfile
└── .github/workflows
Обзор уязвимости CVE-2025-29927
CVE-2025-29927 — это критическая уязвимость безопасности Next.js, позволяющая злоумышленникам обходить аутентификацию и авторизацию на основе промежуточного ПО (middleware). Включив специальный внутренний заголовок (X-Middleware-Subrequest) в HTTP-запросы, злоумышленник может обмануть сервер Next.js, заставив его пропустить выполнение middleware, тем самым получив доступ к защищённым маршрутам. На практике запрос, который обычно был бы заблокирован middleware аутентификации (например, возвращающий 401/403 или перенаправляющий на страницу входа), обрабатывается нормально, если присутствует этот заголовок, что эффективно обходит проверки безопасности. Эта уязвимость затрагивает версии Next.js с 11.1.4 по 15.2.2, и администраторам настоятельно рекомендуется установить исправление или внедрить меры защиты (например, удаление этого заголовка на прокси), чтобы защитить свои приложения.
Обнаружение этой уязвимости в веб-приложении требует нахождения внутренних конечных точек и тестирования их с вредоносным заголовком, чтобы выяснить, возможен ли несанкционированный доступ. Ниже представлен план проектирования продвинутого Python-скрипта, который будет обходить целевой сайт (с полной поддержкой JavaScript) и сканировать на наличие CVE-2025-29927, удовлетворяя всем указанным требованиям.
Чтобы выполнить требование глубокого обхода, включая контент, отображаемый с помощью JavaScript, мы будем использовать Playwright (предпочтительнее Selenium из-за его скорости и современного API). Playwright — это мощная библиотека для автоматизации браузеров без головы, которая может работать с динамическими веб-приложениями и современными JS-фреймворками. По сравнению с Selenium, Playwright предлагает более современный API (построенный на Chrome DevTools Protocol) и поддерживает как синхронную, так и асинхронную работу, что может обеспечить лучшую производительность для нашего случая использования . Ключевые библиотеки и инструкции по их установке включают:
playwright — для автоматизации браузера без головы (для загрузки SPA или страниц, требующих JavaScript). (Установка: pip install playwright и запуск playwright install для получения бинарных файлов браузера).
requests или httpx — для отправки HTTP-запросов во время фазы сканирования. Мы можем использовать requests для простоты или httpx/aiohttp для асинхронной поддержки. (Установка: pip install requests или pip install httpx).
bs4 (BeautifulSoup) — для парсинга HTML и извлечения ссылок при необходимости. Playwright может напрямую запрашивать DOM, но использование BeautifulSoup с HTML-содержимым страницы — это простой способ найти теги привязки. (Установка: pip install beautifulsoup4).
concurrent.futures (встроенный) или asyncio — для реализации конкурентности. Для многопоточности будет использоваться Python concurrent.futures.ThreadPoolExecutor (дополнительная установка не требуется). При асинхронном подходе можно использовать Python asyncio с httpx для параллельных запросов.
(Опционально) argparse — для разбора аргументов командной строки, если мы хотим интерфейс командной строки вместо интерактивного меню. (встроенный модуль)
(Опционально) rich или colorama — для цветного или форматированного вывода в консоль для улучшения читаемости. (Установка: pip install rich или pip install colorama).
Обоснование: Playwright выбран из-за его способности извлекать динамический контент без лишних сложностей. «Используя Playwright, мы можем автоматизировать браузеры без головы... чтобы перемещаться по веб-страницам как человек, что делает его отличным для извлечения данных с динамических веб-сайтов, работающих на JavaScript». Это гарантирует, что наш краулер сможет видеть ссылки или элементы интерфейса, созданные скриптами (которые простой краулер на основе requests пропустил бы).
Модуль-краулер будет использовать Playwright в режиме без головы для глубокого обхода целевого сайта. Цель — обнаружить внутренние пути (конечные точки) для тестирования, включая те, которые становятся видны только после выполнения JavaScript. Ключевые моменты проектирования краулера:
Навигация в браузере без головы: Запустите экземпляр браузера (например, Chromium) в режиме без головы через Playwright. Используйте Browser Context с пользовательским User-Agent, если он указан пользователем (подробнее в следующем разделе). Например, мы можем создать контекст с помощью browser.new_context(user_agent=<user_agent_string>), чтобы эмулировать выбранный User-Agent. Если настроен прокси, примените его при запуске (Playwright позволяет устанавливать прокси-сервер при запуске браузера или контекста).
Стратегия рекурсивного обхода: Начните с заданного базового URL (начального). Используйте page.goto(base_url, timeout=<T>) для загрузки страницы (таймаут настраивается). Дождитесь, пока сеть станет неактивной, или используйте небольшую задержку, чтобы динамический контент загрузился при необходимости. Затем извлеките ссылки. Мы можем извлечь ссылки одним из следующих способов: