使用Elasticsearch防止NoSQL注入

18

我正在使用后端的QueryBuilders构建Elasticsearch查询。该集群未直接暴露在互联网上,只能通过后端访问。

我注意到我正在提供未经过净化的用户输入,并且这使我想起了SQL注入。我知道如何防止SQL注入,但我不确定QueryBuilder是否会转义输入内容?

我发现有一种东西叫做“搜索模板”,它使用mustache。 它们可能正确地转义内容吗? 它们是解决此类问题的“正确方式”吗?

我甚至不确定有何种问题的用户输入可以如此棘手。 当使用QueryBuilder时,我不认为查询的HTTP METHOD可以更改。

也许脚本可能会成为一个问题,但是可以禁用脚本。

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

谢谢! :)


你是否有值得别人花时间去尝试攻击的内容? - Val
内容可能不会受到影响,但我不确定注入攻击的程度。一些SQL注入漏洞在适当的情况下可以被利用,以获得对运行SQL服务器的机器的完全控制。 - Ynv
1个回答

18
你可以在ES中找到所有先前检测到的安全漏洞,但NoSQL注入从未是其中之一...至少目前为止。
然而,你可以找到一些文献谈论如何做到这一点。此外,一些其他讨论和资源可能值得一读。
举个快速的例子,当使用利用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
              }
            }
          }
        ]
      }
    }
  }

由于这是 Elastic Search 注入查询的第一个谷歌搜索结果,我想补充一下,使用 match 和 multi_match 操作而不是 query 可以帮助减少注入攻击的表面,仅限于谓词中字段的值。 - Zambonilli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接