3

我正在尝试调查是否可以在 Ruby on Rails 上使用 mongo 和 mongoid gem 进行 nosql 注入。

我使用包含的Mongo::Client集合和模型完成了Mongodb 的请求Mongoid::Document

我试图传递一些命令字符,例如' " \ ; { },但是被清理了。传球GET search?title[$ne]=foo的特点是{"title"=>"{\"$ne\"=>\"foo\"}"},所以这里似乎没有任何问题。

如果我使用此技术堆栈的普通方法,是否可以进行任何 nosql 注入?

4

3 回答 3

3

Mongoid 中的常见操作(包括查询和插入/更新)会清理它们的输入,因此大多数时候不需要担心“nosql 注入”。

但是,有些方法可以将命令直接传递到数据库,在这些情况下,重要的是要仔细考虑未经处理的用户输入是否最终会成为数据库命令。例如,如果 Post 是 Mongoid 模型,可以运行以下命令在 MongoDB 服务器中创建无限循环:

Post.all.map_reduce('function(){while(true);}','function(){}').out(inline:1).count

另一个例子是Database#command驱动程序提供的运行任意数据库命令的方法:http: //api.mongodb.com/ruby/current/Mongo/Database.html#command-instance_method。如果应用程序将用户输入放入给此方法的参数中,这会产生“nosql 注入”的可能性。

另请注意,不必将意外命令传递给数据库 - 有时意外数据就足够了。例如,参见https://www.owasp.org/index.php/Regular_expression_Denial_of_Service__-_ReDoS。假设 Post 模型有一个 body 字段,从用户那里传递一个任意的正则表达式可能会有问题:

# This might take a while
Post.where('body' => {'$regex' => '((a|a?|a*)*)*$'}).count
于 2019-05-16T22:22:10.850 回答
2

这是来自mongdodb文档

当客户端程序在 MongoDB 中组装查询时,它会构建 BSON 对象,而不是字符串。因此,传统的 SQL 注入攻击不是问题。下面介绍了更多细节和一些细微差别。

MongoDB 将查询表示为 BSON 对象。通常,客户端库提供了一个方便的、无注入的过程来构建这些对象。考虑以下 C++ 示例:

https://docs.mongodb.com/manual/faq/fundamentals/#how-does-mongodb-address-sql-or-query-injection

于 2019-05-15T09:39:55.403 回答
0

可能,而且很容易被忽视。

事实上,你已经很接近了。
不信任来源不仅来自 GET 参数。
Mongoid 什么都帮不了你;在您的示例中,阻止成功利用的原因是,在 RoR 中,您不能将 aHash作为 GET 参数传递。

未经处理的参数可以来自 JSON,例如这个。

posts = PrivatePost.where({ owner_id: json_params[:owner_id] }).each.to_a

Where json_params[:owner_id]can contains { '$ne': 'the owner' }
可能会泄漏posts给其他人。

或者通过基于 POST 的 API 弄乱操作范围:

Post.where({ _id: json_params[:id] }).delete_all
于 2021-10-26T18:55:39.273 回答