【问题标题】:Preventing NoSQL injections with Elasticsearch使用 Elasticsearch 防止 NoSQL 注入
【发布时间】:2019-02-19 15:16:54
【问题描述】:

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

我注意到我为它提供了未经处理的用户输入,这让我想起了 SQL 注入。我知道如何防止 SQL 注入,但我不确定 QueryBuilder 是否会转义输入?

我发现有一个叫做“搜索模板”的东西,它使用了小胡子。他们是否可以正确地转义内容?他们是防止此类问题的“必经之路”吗?

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

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

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

谢谢! :)

【问题讨论】:

  • 您的内容是否值得有人花时间尝试破解它?
  • 内容可能不是,但我不确定是否可以利用扩展注入。在适当的情况下,可以利用一些 SQL 注入弱点来完全控制运行 SQL 服务器的机器。

标签: security elasticsearch code-injection


【解决方案1】:

你可以在 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}"
  }
}

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

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

【讨论】:

  • 由于这是 Elastic Search 注入查询的第一个谷歌结果,我要补充一点,使用 match 和 multi_match 操作而不是查询有助于将注入的表面积减少到仅字段的值谓词。
猜你喜欢
  • 2012-11-06
  • 2016-11-16
  • 2015-09-27
  • 1970-01-01
  • 2017-11-11
  • 2011-06-28
  • 2019-12-15
  • 2013-05-24
相关资源
最近更新 更多