Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Next.js_exploit_CVE-2024-34351 — Образовательная демонстрация уязвимости подделки серверных запросов (SSRF) в Next.js (CVE-2024-34351), с пошаговыми примерами эксплуатации и смягчения. | Kitploit
Инструменты/GitHubGitHub/avergnaud/next.js_exploit_cve-2024-34351
Анализ уязвимостейЭксплуатация веб-приложенийВеб-безопасностьОбучение и ОбразованиеЛаборатории и Практика
GitHubavergnaud/next.js_exploit_cve-2024-34351

Next.js_exploit_CVE-2024-34351

Образовательная демонстрация уязвимости подделки серверных запросов (SSRF) в Next.js (CVE-2024-34351), с пошаговыми примерами эксплуатации и смягчения.

Репозиторий
12 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

csr-rsc-ssg-isr-ssr-ssrf

Этот репозиторий может служить материалом для одного или нескольких митапов. Маршрут следующий...

  • «CSR» (Client Side Rendering) — рендеринг на стороне клиента: React как стандартная SPA-библиотека
  • «RSC» (React Server Components) — выполнение компонентов React только на стороне сервера
  • «SSG» (Static Site Generation) — выполнение компонентов React во время сборки
  • «ISR» (Incremental Static Regeneration) — перегенерация компонентов по запросу
  • «SSR» (Server Side Rendering) — предварительный рендеринг на стороне сервера с последующим выполнением (гидратацией) на стороне клиента
  • «SSRF» (Server Side Request Forgery) — недавно исправленная уязвимость безопасности в Next.JS

Эта работа основана в основном на двух источниках:

  • https://demystifying-rsc.vercel.app/
  • https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps

mind map

CSR (Client Side Rendering)

— загрузка данных в vanilla React SPA

1-csr-load-data

mind map CSR

[!IMPORTANT] CSR (Client-Side Rendering): код React доставляется в браузер, который генерирует контент, вставляемый в DOM.

client side rendering loading data

демо

root@kitploit:~
cd 1-csr-load-data
npm start

CSR load data gif

2-csr-router — маршрутизация в vanilla React SPA

[!IMPORTANT] После первой загрузки страницы навигация по другим страницам того же сайта использует JavaScript для повторного рендеринга частей страницы без полной перезагрузки.

демо

root@kitploit:~
cd 2-csr-router
npm start

client side rendering routing

RSC (React Server Components)

3-rsc-load-data — загрузка данных в React Server Components (реализация Next.js)

mind map CSR

[!IMPORTANT] Компоненты React, предназначенные для выполнения только на сервере, а не в браузере.

React Server Components loading data

демо

root@kitploit:~
cd 3-rsc-load-data
npm run build
npm run start

client side rendering routing

4-rsc-router — маршрутизация в React Server Components (реализация Next.js)

mind map CSR

[!IMPORTANT] Компоненты выполняются только на сервере. Поведение по умолчанию — статический рендеринг: компоненты выполняются на этапе сборки.

демо

root@kitploit:~
cd 4-rsc-router
npm run build
npm run start

React server components routing

5-SSR — SSR (Server Side Rendering)

mind map SSR

[!IMPORTANT] SSR означает предварительный рендеринг клиентских компонентов на сервере. Код React выполняется в момент запроса. Результат может кешироваться для последующих запросов.

Рекомендация: определять компоненты с 'use client'; как можно ниже в дереве компонентов.

https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#moving-client-components-down-the-tree

Гидратация

[!IMPORTANT] «В React „гидратация“ — это то, как React „прикрепляется“ к существующему HTML, который уже был отрисован React в серверной среде. Во время гидратации React пытается прикрепить обработчики событий к существующей разметке и взять на себя рендеринг приложения на клиенте. В приложениях, полностью построенных на React, обычно гидратируется только один „корень“, один раз при запуске всего приложения.»

https://react.dev/reference/react-dom/client/hydrateRoot

https://www.gatsbyjs.com/docs/conceptual/partial-hydration/

демо

root@kitploit:~
cd 5-ssr
npm run build
npm run start

SSR

6-pages-router-ssg (реализация Next.js)

mind map page router SSG

[!IMPORTANT] SSG (Static Site Generation) с использованием pages router: код React выполняется при сборке приложения, а сгенерированный вывод статичен.

демо

root@kitploit:~
cd 6-pages-router-ssg
npm run build
npm run start

7-pages-router-isr (реализация Next.js)

mind map page router ISR

[!IMPORTANT] ISR (с использованием pages router): «Next.js позволяет создавать или обновлять статические страницы после сборки сайта. Инкрементальная статическая регенерация (ISR) позволяет использовать статическую генерацию для каждой страницы без необходимости пересобирать весь сайт. С ISR можно сохранить преимущества статики, масштабируясь до миллионов страниц.»

демо

root@kitploit:~
cd 7-pages-router-isr
npm run build
npm run start

Зачем нужен ISR?

«данные могут устареть во время запроса»

https://vercel.com/blog/nextjs-server-side-rendering-vs-static-generation

Серверные действия

https://react.dev/reference/rsc/server-actions

SSRF (исправлено в NextJS v14.1.1)

Определение SSRF

...

Почему?

  • Если есть доступ к уязвимому серверу, но нет прямого доступа к целевому серверу (DMZ, FireWall...)
  • Если требуется выполнять запросы, скрывая собственное происхождение
  • ...

Демо 8-ssrf-14.1.0

Контекст

SSRF A

https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps

Цель

SSRF B, цель

Условия эксплуатации CVE-2024-34351

  • Приложение на Next.JS версии ниже 14.1.1
  • Использование функции redirect с абсолютным путём. В демо: в addTodo.js — redirect(\/blog/${inputValue}`);`

Работа функции redirect

Источник: https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps

  • Функция Next.JS redirect не возвращает браузеру HTTP-ответ 302.

Next.JS выполняет запрос на стороне сервера, а затем возвращает результат браузеру:

  • Для выполнения запроса Next.JS должен сконструировать URL для вызова. В демо: в addTodo.js — Функция redirect('/blog/123'); конструирует URL http://207.154.209.99/blog/123. Для этого Next.JS получает хост 207.154.209.99 из HTTP-заголовка исходного запроса.
  • Next.JS сначала запрашивает URL с помощью HTTP HEAD.
  • Если ответ содержит заголовок Content-Type: text/x-component, Next.JS запрашивает URL с помощью HTTP GET.

SSRF C, введение

Эксплуатация

Для осуществления SSRF на целевом сервере необходимо запустить другой сервер:

  • который слушает на всех маршрутах (query path)
  • который возвращает HTTP 200 с заголовком Content-Type: text/x-component для любого HEAD-запроса
  • который возвращает HTTP 302 на целевой сервер для любого GET-запроса

SSRF D, эксплойт

CSR load data gif

Исправление уязвимости в 8-ssrf-14.1.0

Решение 1 (непостоянное): настройка nginx для принудительного указания хоста

В /etc/nginx/sites-available/nextjs

До:

root@kitploit:~
server {
  listen 80 default_server;
  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

После:

root@kitploit:~
server {
  listen 80;
  server_name 207.154.209.99;
  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host 207.154.209.99;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

Риск побочных эффектов...

https://nginxtutorials.com/nginx-proxy_set_header-directive/

Решение 2: обновление Next.js

https://github.com/vercel/next.js/security/advisories/GHSA-fr5h-rqp8-mj6g

Примечания

«Лишние атрибуты от сервера»

https://stackoverflow.com/questions/75337953/what-causes-nextjs-warning-extra-attributes-from-the-server-data-new-gr-c-s-c

«getStaticProps» не поддерживается в app/. Подробнее: https://nextjs.org/docs/app/building-your-application/data-fetching

https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#static-site-generation-getstaticprops

create-next-app

https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#step-4-migrating-pages

Страницы в каталоге app по умолчанию являются серверными компонентами. Это отличается от каталога pages, где страницы — клиентские компоненты.

Обновление до Next.js 13 не требует использования нового App Router. Вы можете продолжать использовать pages с новыми функциями, которые работают в обоих каталогах.

Производительность

Если требуется сравнить производительность загрузки для различных решений, можно добавить метрики Web Core Vitals в console.log.

https://web.dev/articles/fcp?hl=fr

Другие источники / ссылки

https://rsc-parser.vercel.app/

https://stackoverflow.com/questions/76325862/what-is-the-difference-between-react-server-components-rsc-and-server-side-ren

https://github.com/reactjs/server-components-demo?tab=readme-ov-file#should-i-use-this-demo-for-benchmarks

https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md#does-this-replace-ssr

https://www.youtube.com/watch?v=jEJEFAc8tSI

ISR с использованием App Router?

https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration

В App Router Next.js все полученные данные по умолчанию являются статическими и отрисовываются во время сборки. Однако это легко изменить: Next.js расширяет объект параметров fetch, предоставляя гибкость в правилах кеширования и ревалидации. Вы можете использовать опцию {next: {revalidate: number}} для обновления статических данных через заданные интервалы или при изменениях на бэкенде (инкрементальная статическая регенерация), а опцию {cache: 'no-store'} можно передать в fetch-запросе для динамических данных (рендеринг на стороне сервера).

https://www.telerik.com/blogs/current-state-react-server-components-guide-perplexed

https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components

https://github.com/reactjs/server-components-demo

https://dev.to/vteacher/let-s-make-a-web-application-with-react-server-components-5dmg

https://react.dev/blog/2024/04/25/react-19

https://react.dev/reference/rsc/server-components

https://www.youtube.com/watch?v=ePAPd9qzGyM

https://www.joshwcomeau.com/react/server-components/

https://nextjs.org/docs/app/building-your-application/rendering/server-components#server-rendering-strategies

https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation

https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props

https://react.dev/reference/rsc/server-components#server-components-without-a-server

Скачать инструмент