# 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.

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

    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`:

    " || "1" != "2

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

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

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

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

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

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

Если операции со скриптами не используются в вашем проекте, рекомендуется полностью отключить выполнение серверных скриптов. Более подробно атаки типа NoSQL и способы их проведения описаны на официальном сайте OWASP по ссылке.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как:

CWE-943 OWASP-5.3.4