您的位置:首页 > 数据库 > Mongodb

nosql注入-mongodb

2016-11-02 10:19 246 查看


SQL数据库具有SQL注入安全问题,所以一直好奇nosql是否有同样问题,经过调研后发现的确有这方面的讨论,但没有详细的描述和测试,因此我打算自己探个究竟。。。。(测试很简单,仅供学习交流



NoSQLinjection test

测试

使用mongo-java-driver
中BasicDBObject



结果:

若用户传入String则较为安全;但如果传入BasicDBObject对象,则可以通过构造特殊的BasicDBObject对象,来跳过检查,这里我用的是正则表达式。

评价:

一般,服务器只接受客户端传来的字符串或其它约定好的结构,所以上述方案没有太大影响。

 

使用mongo-java-driver
中Filters



结果:

与上述情况类似,只有通过构造特殊的BasicDBObject对象来逃避检查;

 

使用pymongo



结果:

通过构造特殊字符串,就可以达到逃避检查的效果。前提:服务器端用eval()来把json格式的字符串转换成pymongo的查询语句(可能还有其它方法,目前只测了这一种)。

评价:

若按照上述方案设计数据库接口,很危险。用户传来的字符串value,需要严格筛选。但话又说回来,若value字段是名字,如David
O` J. Bruce这样含有特殊字符的,怎么筛选?所以还是应该在设计上改进。

 

直接在mongo shell终端操作



结果:

这是正常的正则匹配,但若有途径将/.*/传进来就危险了,上述几个测试均是利用此特性实现的逃避检查。

评价:

mongo支持JavaScript,若有人将恶意代码写入JavaScript,那么,,,!类似的还有$where、mapReduce、group等操作,使用时应谨慎!

(参考mongdb官网描述https://docs.mongodb.com/manual/faq/fundamentals/#how-does-mongodb-address-sql-or-query-injection

所以,对mongodb不但要设置权限,还要尽量禁止JavaScript运行,包括启动时的--eval,

用法:mongo ip:port/db_name --eval ‘db.foo.find({“name”:/.*/})’

 

其它方式的nosql injection

利用json注入实现,利用PHP+JavaScript实现(这个十分类似SQL注入)等

参考:(nosql注入和防范)

http://erlend.oftedal.no/blog/?blogid=110

http://erlend.oftedal.no/blog/?blogid=111

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

http://www.php.net/manual/en/mongo.security.php


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息