🛡 Защищаем свои ресурсы. Часть 4: Command Injection
Всем привет 🤗 Продолжаем образовательную рубрику и сегодня поговорим об уязвимости Command Injection.
Если совсем просто - это ситуация, когда пользователь может заставить сервер выполнить команду операционной системы.
И самое интересное в том, что сервер берет и делает😂.
Что такое Command Injection
Command Injection - это ошибка, при которой приложение передаёт данные пользователя напрямую в системную команду.
То есть: приложение хотело выполнить «безопасную» операцию, а в итоге выполняет то, что подставил пользователь. Как это выглядит в реальной жизни
Допустим, есть функция проверки остатков товара:
/stockStatus?productID=381&storeID=29
Под капотом сервер вызывает системную команду, чтобы получить отчёт.
Если данные из запроса никак не проверяются, злоумышленник может дописать к параметру свою команду.
И сервер выполнит её так же честно, как и «нормальный» запрос.
Что может сделать злоумышленник
Через Command Injection можно:
• узнать, под каким пользователем работает сервер • читать и записывать файлы • отправлять запросы во внешний интернет • получать данные из системы • в ряде случаев - полностью захватить сервер
Причём иногда без «явных» признаков атаки.
Blind Command Injection - когда всё происходит «вслепую»
Иногда сервер не показывает результат выполнения команды.
Но это не значит, что уязвимости нет.
Примеры того, как её всё равно находят: • команда выполняется дольше обычного → сервер «задумался» • вывод команды записывается в файл, который потом можно открыть • сервер делает внешний запрос - и мы его видим
То есть: ответа нет, а эффект - есть.
Где чаще всего возникает Command Injection
Любое место, где приложение:
• вызывает системные утилиты • обрабатывает файлы через shell • работает с почтой, архивами, изображениями • передаёт параметры в системные скрипты
Если данные пользователя попадают в системную команду - это зона повышенного риска.
Почему это всё ещё встречается
• «быстрое» решение через системную команду • доверие входным данным • отсутствие строгой валидации • устаревший или унаследованный код • логика «у нас этим никто не воспользуется»
Как защищаются от Command Injection
Самый надёжный способ:
❌ вообще не вызывать команды операционной системы из пользовательского кода
Если без этого никак, обязательно:
• использовать белый список допустимых значений • проверять, что данные - это число, а не строка • разрешать только буквенно-цифровые символы • исключать спецсимволы и пробелы • никогда не передавать ввод пользователя напрямую в shell
❗️Важно: никакая фильтрация «по символам» не заменит правильную архитектуру.
Вывод
Command Injection - одна из самых опасных уязвимостей.
Не потому, что она сложная, а потому, что она даёт прямой доступ к серверу.
Если приложение выполняет системные команды и доверяет вводу пользователя - это всегда риск полного компромисса.
Такие ошибки редко выглядят критично на первый взгляд, но именно они часто приводят к самым серьёзным инцидентам.
Продолжение следует 👉 Часть 5: Уязвимости в бизнес логике