nosql注入-mongodb





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


NoSQLinjection test

  1. 测试

  1. 使用mongo-java-driver BasicDBObject

结果:

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

评价:

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

 

  1. 使用mongo-java-driver Filters

结果:

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

 

  1. 使用pymongo

结果:

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

评价:

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

 

  1. 直接在mongo shell终端操作

结果:

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

评价:

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

(参考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”:/.*/})’

 

  1. 其它方式的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



猜你喜欢

转载自blog.csdn.net/xdstuhq/article/details/53005150
今日推荐