Райтап на задачу «Кошачья CVEтыня»

skydaemon

Автор:

skydaemon

25 октября 2026

7

25.10.2026

Описание

Мы узнали, что в комнате жрицы скрывается ценная информация. Но доступ туда только ограниченному кругу лиц. Возможно, есть способ пробраться окольными путями, так как бекенд сайта давно не обновлялся.

Зайдём на целевой сайт. Осмотрев его полностью с помощью Burp, увидим, что единственная функциональная форма лежит на страничке /login

Форма авторизации на странице login задания «Кошачья CVEтыня»

По путям к статике и заголовку в ответе видим, что сайт крутится на Next.js

Пути к статике и заголовки ответа Next.js

Если немножко покопаться в чанках, то можно найти и версию Next.js:

Версия Next.js в JavaScript-чанке приложения

А можно воспользоваться прекрасным расширением для Firefox:

Определение версии Next.js расширением Firefox

А ещё можно просто быть внимательным и увидеть хинт:

Подсказка с номером уязвимости CVE-2025-29927

— буквально номер нашей уязвимости Next.js Middleware Bypass Vulnerability (CVE-2025-🟡29927). Теперь, зная, что мы точно имеем дело с CVE (это, в целом, было понятно и из названия задачи — CVEтыня), посетим https://www.exploit-db.com/

Описание уязвимости и PoC на Exploit Database

Версия подходит и PoC имеется. Изучив информацию об уязвимости, проверим, подтвердится ли её наличие, ведь самое главное условие её реализации — это наличие на бекенде middleware, выполняющего проверку доступа к странице. Для проверки уязвимости отправим запрос GET на защищённую авторизацией страницу (её имя мы видим в адресной строке, сразу после перехода на форму авторизации)

Адрес защищённой страницы в форме авторизации
Ответ 307 при запросе защищённой страницы

Если бекенд возвращает 307, то защита узла срабатывает и нас возвращает на login — само по себе это не подтверждает CVE, но показывает, что доступ к странице перехватывается до того, как мы получаем её содержимое. Сама суть CVE-2025-29927 в том, что Next.js использует служебный заголовок x-middleware-subrequest, чтобы отличать внутренние вызовы middleware от обычных запросов. В уязвимых версиях этот механизм можно использовать, чтобы обойти проверки, выполняемые в самом middleware. Для начала попробуем простой вариант, заключающийся в отправке запроса с дополнительным заголовком x-middleware-subrequest: middleware

Проверка заголовка x-middleware-subrequest со значением middleware

Но тут нас ждёт сюрприз — эксплоит из первого репозитория в GitHub не срабатывает — мы всё ещё получаем 307 вместо байпаса middleware. Но не надо отчаиваться! Потратив ещё пару минут в Google, можно найти информацию по конкретным версиям Next.js.

Описание обхода middleware для разных версий Next.js

Применяем заголовок

x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

И вуаля! Получаем в ответ всю защищённую страничку!

Защищённая страница после обхода middleware
Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Портовая куртизанка»

/Разборы задач

Райтап на задачу «Портовая куртизанка»

Жемчужину скрывает только одна ракушка из десятков тысяч.
Прочитать

5

Райтап на задачу «Альтушка с БАГуслуг»

/Разборы задач

Райтап на задачу «Альтушка с БАГуслуг»

БАГуслуги сильно сбоят, а саппорт игнорит. Им точно доходит фидбек?
Прочитать

5