﻿# V5337\. OWASP\. Possible NoSQL injection\. Potentially tainted data is used to create query\.

Анализатор обнаружил использование непроверенных данных из внешнего источника для формирования запроса к NoSQL базе данных\. Это может стать причиной NoSQL\-инъекции в случае, если данные скомпрометированы\.

Уязвимости такого типа относятся к категории рисков OWASP Top 10 Application Security Risks 2021:

* [A3:2021\-Injection\.](https://owasp.org/Top10/A03_2021-Injection/)

Рассмотрим пример:

```cpp
public List<Document> getFoo(String bar) {
  BasicDBObject query = new BasicDBObject();
  query.put(
      "$where",
      "this.bar == \"" + bar + "\""
  );

  MongoCursor<Document> cursor = collection.find(query).iterator();
  // ....
}
```

При формировании NoSQL\-запроса в оператор `$where` передаются непроверенные данные, полученные из параметра публичного метода\. Так как метод публичный, туда могут попасть непроверенные данные из внешних источников: контроллеров, форм и т\. д\. Оператор `$where` интерпретирует JavaScript код, указанный во втором аргументе метода `put`, что открывает злоумышленникам возможность внедрять произвольные команды в запрос\.

Вместо ожидаемого поискового критерия злоумышленник может ввести специальную команду\. Из базы произойдёт извлечение всех данных, для которых будет запущена дальнейшая обработка\.

Пример такой скомпрометированной строки для параметра `bar`:

```cpp
" || "1" != "2
```

Для защиты от подобных атак следует использовать параметризацию:

```cpp
public List<Document> getFoo(String bar) {
  BasicDBObject query = new BasicDBObject();
  query.append("bar", bar);

  MongoCursor<Document> cursor = collection.find(query).iterator();
    // ....
}
```

Или сформировать запрос в формате BSON при помощи специального класса `Filters`:

```cpp
public List<Document> getFoo(String bar) {
  Bson filter = Filters.and(
      Filters.eq("bar", bar)
  );

  MongoCursor<Document> cursor = collection.find(filter).iterator();
  // ....
}
```

Если операции со скриптами не используются в вашем проекте, рекомендуется полностью [отключить выполнение серверных скриптов](https://www.mongodb.com/docs/manual/reference/operator/query/where/#javascript-enablement)\. Более подробно атаки типа NoSQL и способы их проведения описаны на официальном сайте OWASP по [ссылке](https://cheatsheetseries.owasp.org/cheatsheets/NoSQL_Security_Cheat_Sheet.html)\.