使用Elasticsearch防止NoSQL注入

问题描述 投票:4回答:1

我正在后端使用QueryBuilders构建Elasticsearch查询。群集不直接暴露于Internet,只能通过后端访问。

我已经注意到我向它提供了非标准的用户输入,它使我想起了SQL注入。我知道如何防止SQL注入,但是我不确定QueryBuilder是否转义了输入?

我发现有一个叫做'Search Templates'的东西,它使用胡须。他们是否可以正确地转义内容?他们是防止此类问题的“解决之道”吗?

我什至不确定有问题的用户输入会是什么样。使用QueryBuilder时,我认为查询的HTTP METHOD不能更改。

也许脚本编写可能是一个问题,但是可以将其禁用。

重申我的问题:代码注入对Elasticsearch是一个问题,如果是,缓解它们的最佳方法是什么?

谢谢! :)

security elasticsearch code-injection
1个回答
5
投票

您可以在ES中找到所有的previously detected security flaws,但是到目前为止,NoSQL注入从来都不是其中之一...

但是,您会发现some literature讨论了如何做到这一点。还有一些other discussions and resources可能值得阅读。

作为一个简单的示例,当使用利用Mustache模板语言的搜索模板时,绝对有可能发起NoSQL注入攻击。例如,假设我们有以下两个文档:

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}"
  }
}

最终查询看起来像这样,即我们能够插入一个应该泄漏整个索引的应该子句:

  {
    "query" : {
      "bool" : {
        "filter" : [
          {
            "term" : {
              "field1" : 2
            }
          }
        ],
        "should" : [
          {
            "range" : {
              "field2" : {
                "lte" : 2
              }
            }
          },
          {
            "range" : {
              "field2" : {
                "gte" : 2
              }
            }
          }
        ]
      }
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.