使用 Elasticsearch 的 Java 框架
漏洞代码示例
Elasticsearch允许以多种方式执行数据库查询,其中之一是使用搜索模板。该特性允许使用Mustache模板语言规范部分查询,然后在执行之前用适当的值填充查询。
但是必须小心,因为通过使用{{{…}}}符号,Mustache可能不会对用户提供的值执行任何转义。恶意用户可能会转义JSON字符串并更改查询语义。下面有个例子,考虑以下Elasticsearch查询,它根据用户提供的值进行过滤:
{
"query": {
"match": {
"somefield": {
"query": "{{{somevalue}}}"
}
}
}
}
通过将上面代码片段中的somevalue替换为有效载荷”,” zero _terms_query”:”all,可以将查询转换为一个匹配所有值的查询,从而使过滤器无效:
{
"query": {
"match": {
"somefield": {
"query": "",
"zero_terms_query": "all"
}
}
}
}
如何防护
为了避免这种威胁,当处理不可信的数据时,开发人员应该选择使用{{…}}这样的构造,因为它正确地转义了 双引号 。上面的查询应该重写为:
{
"query": {
"match": {
"somefield": {
"query": "{{somevalue}}"
}
}
}
}