7. Command Injection - Инъекция команд

 

Что такое Command Injection

Уязвимость Command Injection или Инъекция команд возникает на стороне сервера, когда некоторые URL параметры обрабатываются утилитами операционной системы. При этом, если данные параметры не фильтруются, то злоумышленник может ввести произвольные команды, которые также будут выполнены.

Например, рассмотрим следующую URL:

Пример URL с возможной уязвимостью Command Injection

Здесь мы вызываем серверный скрипт или программу, которая читает указанный файл и затем передает его содержимое в браузер. Из рисунка видно, что приложение написано на языке Perl и для выполнения скриптов необходимо вызвать соответствующий интерпретатор. Вот как будет выглядеть команда на сервере:

perl  /var/www/readFile.pl  manual.pdf

Если на сервере не проводится фильтрация вводимых данных, то вместе с легитимными данными можно внедрить и команды операционной системы:

Внедренная команда на сервере при наличии Command Injection

На сервере данная команда будет выглядеть так:

perl  /var/www/readFile.pl  manual.pdf;cat /etc/passwd

В данном примере мы применили специальный сепаратор команд (; - точка с запятой). Он позволяет указывать несколько команд, которые будут выполены последовательно одна за другой. В результате мы получим содержимое файлов manual.pdf и /etc/passwd. Если на сервере присутствует уязвимость Command Injection, то становится возможным внедрить практически любую команду.

 

Command Chaining (Сепараторы команд)

В системах Linux и Windows имеется возможность последовательного ввода сразу нескольких команд. Причем команды могут выполнены системой одна за другой либо в зависимости от результата работы предыдущих. В англоязычной литературе мы можете встретить такой термин, как “chaining”, что может означать «цепочка команд».

Для разделения команд используются специальные сепараторы (разделители), которые указвают системе, как выполнять введенные команды. В таблице ниже даны некоторые разделители команд:

На Linux

На Windows

Результат

command1 && command2

command1 && command2

command2 выполняется, если command1 выполнилась успешно

command1 || command2

command1 || command2

command2 выполняется, если command1 не выполнилась

command1 ; command2

command1 & command2

Обе команды будут выполнены последовательно

command1 | command 2

command1 | command 2

На Windows обе команды будут выполнены последовательно, на Linux – будет отображен вывод только второй команды

`command`

Не поддерживается

Команда, заключенная в обратные кавычки будет выполнена

$(command)

Не поддерживается

Команда будет выполнена

command1 %0A command2

command1 %0A command2

Символ %0A означает новая строка. Обе команды будут выполнены последовательно

С помощью данных разделитей мы можем внедрять любые команды.