OWASP API Security Top 10: 0xa8 injection

# API8:2019 Инъекции

| Источники угроз/Векторы атак | Недостатки безопасности | Последствия |
| - | - | - |
| Зависит от API : Сложность эксплуатации **3** | Распространенность **2** : Сложность обнаружения **3** | Технические последствия **3** : Зависит от бизнеса |
| Злоумышленник может отправить в API любые данные через любой доступный вектор инъекции (например, прямой ввод, параметры, интегрированные сервисы и так далее), предполагая, что они будут перенаправлены в интерпретатор. | Ошибки, приводящие к инъекциям, очень распространены и присущи SQL, LDAP и NoSQL запросам, командам на операционной системе, XML парсерам и ORM. Подобные ошибки легко обнаруживаются в ходе анализа исходного кода. Злоумышленники могут использовать сканеры и фаззеры. | Инъекции могут привести к разглашению или уничтожению данных, отказу в обслуживании или получению злоумышленником полного контроля на сервером. |

## Как определить, является ли API уязвимым?

API уязвим к инъекциям, если:

* Данные, поступившие от пользователя, не валидируются, не фильтруются или не очищаются на стороне API.
* Данные, поступившие от пользователя, конкатенируются или используются в неизменном виде в SQL/NoSQL/LDAP запросах, командах на операционной системе, XML парсерах, ORM (Object Relational Mapping) или ODM (Object Document Mapper).
* Данные поступающие из внешних систем (например, интегрированных систем) не валидируются, не фильтруются или не очищаются на стороне API.

## Примеры сценариев атаки

## Сценарий #1

Прошивка устройства контроля за детьми предоставляет точку входа `/api/CONFIG/restore`, которая ожидает запроса с multipart параметром appId. Используя декомпилятор, злоумышленник обнаруживает, что appId передается непосредственно в вызов команды на операционной системе без предварительной очистки:

```c
snprintf(cmd, 128, "%srestore_backup.sh /tmp/postfile.bin %s %d",
         "/mnt/shares/usr/bin/scripts/", appid, 66);
system(cmd);
```

Следующая команда позволяет злоумышленнику отключить любое устройство с уязвимой прошивкой:

```
$ curl -k "https://${deviceIP}:4567/api/CONFIG/restore" -F 'appid=$(/etc/pod/power_down.sh)'
```

### Сценарий #2

Рассмотрим приложение с базовым CRUD функционалом для операций с бронированиями. Злоумышленник обнаружил NoSQL инъекцию через параметр `bookingId` в запросе на удаление бронирования. Запрос выглядит следующим образом: `DELETE /api/bookings?bookingId=678`.

Сервер API обрабатывает запросы на удаление с помощью следующей функции:


```javascript
router.delete('/bookings', async function (req, res, next) {
  try {
      const deletedBooking = await Bookings.findOneAndRemove({'_id' : req.query.bookingId});
      res.status(200);
  } catch (err) {
     res.status(400).json({error: 'Unexpected error occured while processing a request'});
  }
});
```

Злоумышленник перехватывает запрос и изменяет параметр `bookingId`, как продемонстрировано ниже. В этом случае злоумышленник может удалить бронирование, принадлежащее другому пользователю:

```
DELETE /api/bookings?bookingId[$ne]=678
```

## Как предотвратить

Для предотвращения инъекций необходимо отделять данные от команд и запросов.

* Валидируйте данные, используя одну доверенную и активно поддерживаемую библиотеку.
* Валидируйте, фильтруйте и очищайте все данные, получаемые от клиентов или интегрированных систем.
* Специальные символы должны быть экранированы, используя синтаксис целевого интерпретатора.
* Отдайте предпочтение безопасному API, предоставляющему параметризированный интерфейс.
* Всегда ограничивайте количество возвращаемых записей, чтобы предотвратить массовую утечку данных в случае инъекции.
* Валидируйте входящие данные с помощью надлежащих фильтров, допуская только подходящие значения каждого из входящих параметров.
* Определите тип данных и строгую модель данных для всех строковых параметров.

## Ссылки

### OWASP

* [OWASP Injection Flaws][1]
* [SQL Injection][2]
* [NoSQL Injection Fun with Objects and Arrays][3]
* [Command Injection][4]

### Внешние

* [CWE-77: Command Injection][5]
* [CWE-89: SQL Injection][6]

[1]: https://www.owasp.org/index.php/Injection_Flaws
[2]: https://www.owasp.org/index.php/SQL_Injection
[3]: https://www.owasp.org/images/e/ed/GOD16-NOSQL.pdf
[4]: https://www.owasp.org/index.php/Command_Injection
[5]: https://cwe.mitre.org/data/definitions/77.html
[6]: https://cwe.mitre.org/data/definitions/89.html