OS command injection
В этом разделе мы узнаем, что такое OS command injection, посмотрим, как обнаруживать и эксплуатировать уязвимости, увидим примеры полезных команды и приёмы для разных ОС и рассмотрим, как предотвращать OS command injection.
Лабораторные работы
Если вы знакомы с базовыми концепциями уязвимостей OS command injection и хотите попрактиковаться в их эксплуатации на реалистичных, намеренно уязвимых целях, перейдите к лабораторным работам по ссылке ниже.
Что такое OS command injection?
OS command injection также известна как «shell injection», позволяет атакующему выполнять команды операционной системы на сервере, на котором работает приложение, и обычно полностью компрометировать приложение и его данные. Часто атакующий может использовать уязвимость OS command injection, чтобы скомпрометировать другие части хостинговой инфраструктуры и, эксплуатируя доверительные отношения, развить атаку на другие системы внутри организации.
Внедрение OS command injection
В этом примере приложение интернет-магазина позволяет пользователю посмотреть, есть ли товар в наличии в конкретном магазине. Эта информация доступна по URL:
Чтобы предоставить сведения о наличии, приложению нужно опросить различные легаси-системы. По историческим причинам функциональность реализована через вызов shell-команды с идентификаторами товара и магазина в качестве аргументов:
Эта команда выводит статус наличия указанного товара, который возвращается пользователю.
Приложение не реализует защиту от OS command injection, поэтому атакующий может отправить следующий ввод для выполнения произвольной команды:
Если этот ввод отправить в параметре productID, команда, выполняемая приложением, будет такой:
Команда echo заставляет вывести переданную строку в выходные данные. Это полезный способ проверять некоторые типы OS command injection. Символ & — разделитель команд shell. В этом примере он приводит к выполнению трёх отдельных команд, одна за другой.
Вывод, возвращённый пользователю:
Три строки вывода демонстрируют, что:
Исходная команда
stockreport.plбыла выполнена без ожидаемых аргументов, поэтому вернула сообщение об ошибке.Внедрённая команда
echoбыла выполнена, и переданная строка появилась в выводе.Исходный аргумент
29был выполнен как команда, что вызвало ошибку.
Размещение дополнительного разделителя команд & после внедрённой команды полезно, поскольку отделяет внедрённую команду от того, что следует после точки инъекции. Это снижает вероятность того, что последующее предотвратит выполнение внедрённой команды.
Полезные команды
После того как вы обнаружили уязвимость OS command injection, полезно выполнить некоторые первичные команды, чтобы получить информацию о системе. Ниже приведена сводка команд, полезных на платформах Linux и Windows:
Имя текущего пользователя
whoami
whoami
Операционная система
uname -a
ver
Сетевые настройки
ifconfig
ipconfig /all
Сетевые соединения
netstat -an
netstat -an
Запущенные процессы
ps -ef
tasklist
Blind OS command injection
Многие OS command injection — «слепые» уязвимости. Это означает, что приложение не возвращает вывод команды в своём HTTP-ответе. Слепые уязвимости всё ещё можно эксплуатировать, но требуются другие техники.
Например, представим сайт, который позволяет пользователям отправлять отзыв. Пользователь вводит свой адрес email и текст отзыва. Серверное приложение затем формирует письмо администратору сайта с содержимым отзыва. Для этого оно вызывает программу mail с переданными данными:
Вывод команды mail (если он есть) не возвращается в ответах приложения, поэтому полезная нагрузка с echo здесь не сработает. В этой ситуации можно использовать различные другие техники для обнаружения и эксплуатации уязвимости.
Обнаружение Blind OS command injection с помощью временных задержек
Можно использовать внедрённую команду, создающую временную задержку, чтобы по времени ответа приложения подтвердить, что команда была выполнена. Команда ping хорошо подходит для этого, поскольку позволяет указать число ICMP-пакетов для отправки. Это даёт возможность управлять временем выполнения команды:
Эта команда заставляет приложение пинговать свой loopback-интерфейс 10 секунд.
Эксплуатация Blind OS command injection через перенаправление вывода
Можно перенаправить вывод внедрённой команды в файл внутри web-root, который затем можно получить через браузер. Например, если приложение отдаёт статические ресурсы из файловой системы по пути /var/www/static, можно отправить такой ввод:
Символ > отправляет вывод команды whoami в указанный файл. Затем можно через браузер забрать https://vulnerable-website.com/whoami.txt, чтобы получить файл и увидеть вывод внедрённой команды.
Эксплуатация Blind OS command injection с использованием out-of-band (OAST) техник
Можно использовать OS command injection, которая вызовет внеполосное сетевое взаимодействие (out-of-band) с системой, контролируемой вами, применяя техники OAST. Например:
Эта полезная нагрузка использует команду nslookup, чтобы инициировать DNS-запрос к указанному домену. Атакующий может отслеживать, произошёл ли запрос, чтобы подтвердить успешность выполнения команды.
Внеполосный канал предоставляет простой способ эксфильтрации вывода внедрённых команд:
Это приводит к DNS-запросу к домену атакующего, который содержит результат команды whoami:
Способы внедрения OS command injection
Можно использовать ряд метасимволов shell для проведения атак OS command injection. Некоторые символы работают как разделители команд и позволяют сцеплять команды. Следующие разделители команд работают и в Windows, и в Unix-подобных системах:
&&&|||
Следующие разделители работают только в Unix-подобных системах:
;Newline (
0x0aor\n)
В Unix-подобных системах также можно использовать обратные кавычки или символ доллара для встроенного выполнения внедрённой команды внутри исходной:
`injected command`$(injected command)
Разные метасимволы shell имеют слегка различающееся поведение, что может влиять на их работоспособность в определённых ситуациях. Это может определять, позволят ли они получить вывод команды в текущем канале (in-band) или пригодны только для «слепой» эксплуатации.
Иногда контролируемый вами ввод оказывается внутри кавычек в исходной команде. В таком случае нужно завершить контекст кавычек (с помощью " или '), а затем использовать подходящие метасимволы shell для инъекции новой команды.
Как предотвращать атаки OS command injection
Самый эффективный способ предотвращать уязвимости OS command injection — никогда не вызывать OS command из кода уровня приложения. Почти всегда существуют другие способы реализовать необходимую функциональность, используя безопасные платформенные API.
Если вам всё же приходится вызывать OS command с пользовательским вводом, необходимо выполнять строгую проверку ввода. Примеры эффективной проверки:
Проверка по разрешающему списку допустимых значений.
Проверка, что ввод — число.
Проверка, что ввод содержит только буквенно-цифровые символы, без иной синтаксической информации и пробелов.
Никогда не пытайтесь «очищать» ввод с помощью экранирования метасимволов shell. На практике это слишком ошибко опасно и может быть обойдёно квалифицированным атакующим.
Last updated