Перейти к содержимому

Поиск по платформе

Code Injection: eval() в Node.js калькуляторе

Веб-калькулятор вычисляет пользовательские выражения через eval(). Это даёт атакующему полный RCE: доступ к process.env, child_process и любым модулям Node.js.

Автор: Hack & Fix
Освоишь: exec.Command argsбез shell -cinput allowlist
Сложно+90 XP ~65 мин nodejs
CWE-77 · A03:2021 Pro
Обложка: Code Injection: eval() в Node.js калькуляторе Обложка: Code Injection: eval() в Node.js калькуляторе
Задача
# Code Injection: выполнение произвольного кода через eval ## Сценарий Вы аудируете **BulkBuy** — магазин оптовых закупок на Express. На сайте есть калькулятор скидок: покупатель вводит выражение, сервер вычисляет и показывает итог. Разработчик гордо рассказывает, что «вычисления делает сам движок — ни одного самописного парсера». Ваша задача на аудите — проверить, чем ещё занимается этот движок, помимо арифметики. ## Цель 1. Войдите под обычным аккаунтом и найдите калькулятор. 2. Проверьте, ограничивается ли вычислитель арифметикой: подайте ему конструкции, выходящие за пределы математики. 3. Через полученный канал выполните код в процессе приложения и добудьте CTF-флаг из окружения процесса. ## Теория Code Injection (CWE-95): пользовательский ввод попадает в механизм динамического выполнения кода и перестаёт быть данными — становится программой. Это сильнее классической инъекции команд через shell: исполняется код на языке самого приложения, со всеми его возможностями — глобальным объектом процесса, загрузкой модулей, файловыми API, без единого метасимвола оболочки. **Уязвимый паттерн:** ```javascript // Выражение пользователя выполняется как код: const expression = (req.body && req.body.expression) || ''; let result = eval(expression); // полный доступ к языку и процессу ``` Универсальный вычислитель не умеет отличать безопасную арифметику от опасного кода: всё синтаксически корректное выполняется в контексте приложения. Результат возвращается в интерфейс — значит, и прочитанные данные окажутся прямо в поле ответа калькулятора. ## Точка входа атаки `POST /calculator` — поле `expression`; доступно любому вошедшему пользователю. * **Обычный пользователь:** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: Command Injection: Обход Blacklist-фильтра в Node.js Обложка лабы: Command Injection: Обход Blacklist-фильтра в Node.js
CMD Injection

Command Injection: Обход Blacklist-фильтра в Node.js

Функция ping в админ-панели защищена blacklist-фильтром, блокирующим пробелы и ключевые слова cat/flag/tail/less/more. Фильтр обходится через ;id, ;env и другие конструкции без пробелов.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: Blind Command Injection: time-based инъекция без вывода в Node.js Обложка лабы: Blind Command Injection: time-based инъекция без вывода в Node.js
CMD Injection

Blind Command Injection: time-based инъекция без вывода в Node.js

API сетевой диагностики Express выполняет ping через child_process.exec, но вывод не возвращается клиенту. Уязвимость подтверждается через задержку ответа (timing-based blind injection).

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: Command Injection: Базовая инъекция команд в Node.js Обложка лабы: Command Injection: Базовая инъекция команд в Node.js
CMD Injection

Command Injection: Базовая инъекция команд в Node.js

Панель администратора содержит инструмент диагностики сети, передающий ввод напрямую в child_process.exec() без фильтрации.

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: Argument Injection в архиваторе файлов Обложка лабы: Argument Injection в архиваторе файлов
CMD Injection

Argument Injection в архиваторе файлов

Обработчик архивации файлов использует exec.Command без shell, но не фильтрует аргументы, начинающиеся с '-'. Атакующий может внедрить произвольные флаги команды tar.

+90 XP
Go Pro
Exploit Fix