
Эксплойт Proof-of-concept для CVE-2025-55182, критической уязвимости RCE в Next.js Server Actions. Использует небезопасную десериализацию в протоколе React Flight для выполнения произвольных команд через prototype pollution и sandbox bypass.
Скрипт Proof-of-Concept (PoC) для React2Shell (CVE-2025-55182), критической уязвимости удаленного выполнения кода (RCE), затрагивающей приложения Next.js, использующие Server Actions.
[!WARNING] Отказ от ответственности: Этот инструмент предназначен только для образовательных и авторизованных целей тестирования. Я не несу ответственности за неправильное использование.
Этот скрипт эксплуатирует уязвимость небезопасной десериализации в протоколе "Flight" компонентов React Server. Он позволяет неавторизованным злоумышленникам выполнять произвольный JavaScript-код на сервере, что приводит к частичному удаленному выполнению кода (RCE).
require (global.require или через конструктор модуля), что гарантирует работу на современных версиях Node.js (v14+).pip install -r requirements.txt
python3 react2shell.py -u <TARGET_URL> [-c <COMMAND>]
| Аргумент | Описание | По умолчанию |
|---|---|---|
-u, --url | Обязательный. Целевой URL (например, http://localhost:3000/). | N/A |
-c, --cmd | Необязательный. Команда для выполнения на сервере. | id |
Проверка идентификации пользователя:
python3 react2shell.py -u http://127.0.0.1:3000/
Просмотр содержимого каталога:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "ls -la"
Чтение конфиденциального файла:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "cat /etc/passwd"
Эксплойт использует цепочку Prototype Pollution (загрязнение прототипа) и небезопасной десериализации в обработке Server Actions в Next.js для React Server Components (RSC).
Next-Action сигнализирует серверу о необходимости обработки Server Action.then ("$1:__proto__:then"). Это заставляет асинхронный обработчик запросов сервера воспринимать полезную нагрузку как "Thenable" (объект, похожий на Promise)._response. Поле _prefix обычно используется для внутренней буферизации потока, но, манипулируя им, мы можем внедрить необработанный JavaScript.require часто удаляется из глобальной области видимости для предотвращения RCE. Скрипт обходит это, проходя по цепочке прототипов process.mainModule:
var require = global.require || global.process.mainModule.constructor._load;
child_process и выполнять системные команды.execSync), а вывод выбрасывается как объект Error. Эта ошибка сериализуется и возвращается клиенту в теле HTTP-ответа, что позволяет нам увидеть вывод команды.Этот инструмент был разработан при содействии Gemini 3 Pro.