Возможно ли внедрение nosql для Ruby on Rails с Mongoid?
Я пытаюсь выяснить, возможна ли инъекция nosql на Ruby on Rails с монго и монгоидными драгоценными камнями.
Я сделал запросы Mongodb, используя Mongo::Client
коллекции и модели с Mongoid::Document
включение.
Я пытался передать некоторые командные символы, такие как ' " \ ; { }
, но был продезинфицирован. Переходя GET search?title[$ne]=foo
был черт как {"title"=>"{\"$ne\"=>\"foo\"}"}
так что, похоже, никаких проблем здесь нет.
Возможна ли какая-либо инъекция nosql, если я использую обычные методы стека этой технологии?
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. Если приложение помещает пользовательский ввод в параметры, заданные этому методу, это создает потенциал для "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
Это из mongdodb
документы
Когда клиентская программа собирает запрос в MongoDB, она создает объект BSON, а не строку. Таким образом, традиционные атаки SQL-инъекций не являются проблемой. Подробнее и некоторые нюансы освещены ниже.
MongoDB представляет запросы в виде объектов BSON. Обычно клиентские библиотеки предоставляют удобный, не требующий инъекций процесс создания этих объектов. Рассмотрим следующий пример C++:
Возможно, и это легко не заметить.
Фактически, вы довольно близки.
Источники недоверия - это не только параметры GET.
Mongoid вам ни в чем не поможет; в вашем примере успешной эксплуатации препятствует тот факт, что в RoR вы не можете пройти
Hash
как параметр GET.
Необработанный параметр может поступать из JSON, например, как этот.
posts = PrivatePost.where({ owner_id: json_params[:owner_id] }).each.to_a
Где
json_params[:owner_id]
мог бы содержать
{ '$ne': 'the owner' }
,
который может протекать
posts
кому-то другому.
Или поиграйте с областью действия через API на основе POST:
Post.where({ _id: json_params[:id] }).delete_all