/Разборы задач
25 октября 2026
Райтап на задачу «Портовая куртизанка»
Жемчужину скрывает только одна ракушка из десятков тысяч.5
7
Мы узнали, что в комнате жрицы скрывается ценная информация. Но доступ туда только ограниченному кругу лиц. Возможно, есть способ пробраться окольными путями, так как бекенд сайта давно не обновлялся.
Зайдём на целевой сайт. Осмотрев его полностью с помощью Burp, увидим, что единственная функциональная форма лежит на страничке /login
По путям к статике и заголовку в ответе видим, что сайт крутится на Next.js
Если немножко покопаться в чанках, то можно найти и версию Next.js:
А можно воспользоваться прекрасным расширением для Firefox:
А ещё можно просто быть внимательным и увидеть хинт:
— буквально номер нашей уязвимости Next.js Middleware Bypass Vulnerability (CVE-2025-🟡29927). Теперь, зная, что мы точно имеем дело с CVE (это, в целом, было понятно и из названия задачи — CVEтыня), посетим https://www.exploit-db.com/
Версия подходит и PoC имеется. Изучив информацию об уязвимости, проверим, подтвердится ли её наличие, ведь самое главное условие её реализации — это наличие на бекенде middleware, выполняющего проверку доступа к странице. Для проверки уязвимости отправим запрос GET на защищённую авторизацией страницу (её имя мы видим в адресной строке, сразу после перехода на форму авторизации)
Если бекенд возвращает 307, то защита узла срабатывает и нас возвращает на login — само по себе это не подтверждает CVE, но показывает, что доступ к странице перехватывается до того, как мы получаем её содержимое. Сама суть CVE-2025-29927 в том, что Next.js использует служебный заголовок x-middleware-subrequest, чтобы отличать внутренние вызовы middleware от обычных запросов. В уязвимых версиях этот механизм можно использовать, чтобы обойти проверки, выполняемые в самом middleware. Для начала попробуем простой вариант, заключающийся в отправке запроса с дополнительным заголовком x-middleware-subrequest: middleware
Но тут нас ждёт сюрприз — эксплоит из первого репозитория в GitHub не срабатывает — мы всё ещё получаем 307 вместо байпаса middleware. Но не надо отчаиваться! Потратив ещё пару минут в Google, можно найти информацию по конкретным версиям Next.js.
Применяем заголовок
x-middleware-subrequest: middleware:middleware:middleware:middleware:middlewareИ вуаля! Получаем в ответ всю защищённую страничку!