flawopen.com/command-injection/Csharp
Learn how to fix Command Injection (CWE-78) in C# / .NET. Side-by-side vulnerable vs secure code examples for ProcessStartInfo.ArgumentList with UseShellExecute false.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-csharp.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
// Concatenating into Arguments string
var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
// Attacker input: "test.txt & net user /add evil Password123!"
Arguments = $"/c type {userInput}",
RedirectStandardOutput = true
};
Process.Start(psi);
// Using ArgumentList (.NET Core / .NET 5+) without shell
var psi = new ProcessStartInfo
{
FileName = "notepad.exe"
};
// Arguments added individually to ArgumentList are never parsed as shell commands
psi.ArgumentList.Add(userInput);
Process.Start(psi);
ProcessStartInfo.ArgumentList.Add() instead of Arguments.