MongoDB注入笔记
时间:2016-12-13 15:32 来源:转载 作者:www.aptno1.com 点击:次
很久以前就听说过MongoDB数据库了,之前也学习过但是后面几乎没怎么用就忘了,当时据说因为不是传统的关系型数据库NoSQL数据库也没有SQL注 入一说,还是比较安全的,MongoDB火了一段时间之后随着大家对它的了解越来越深逐渐的也发现了一些安全方面的问题,后来也还是无法避免的出现了由于 输入经过构造的语句达到类似SQL注入的效果,可以从未过滤特殊字符的地方获取到数据库信息。很早之前也在网上看到过关于Mongodb注入的资料,但是 一直没去仔细学习,今天就认真学习并记录一下。 测试环境配置如下: OS:CentOS 6.6 x86_64 WEB:Nginx 1.9.2 PHP:5.4.42 MongoDB:3.0.4 需要对数据库进行注入攻击首先就是要在数据库中有数据,在这里新建一个集合并且插入一些数据。所谓集合通俗的说法就等价于平时关系型数据库里面的表。 ![]() TEST数据库有了USER的集合之后下面就是PHP的代码部分,以下是关键部分代码。 ![]() 可以看到这是标准的查询代码,当我们在登录的地方输入了帐号密码之后没有经过过滤就直接带入查询,而查询语句则是: array( ‘LoginID’=>’username’,’’LoginPW’=>’password’) 那么对应在数据库服务器的查询语句则是: db.user.find({‘LoginID’=>’username’,’’LoginPW’=>’password’}) 下面来看一下查询一个正确存在的信息与一个错误不存在信息的对比。 ![]() 这条语句转换成我们平时所熟悉的SQL语句为: SELECT * FROM USER WHERE LoginID=’username’ AND LoginPW=’password’ 那么知道了查询语句后如何进行注入呢?这里就用到了MongoDB里面的关键字“[$ne]”。这个关键字能起到什么作用并且如何理解呢?先来看一下带入了“[$ne]”之后的查询语句。 ![]() 可以看到修改之后的内容被解析成了: Array ( [LoginID] => Array ( [$ne] => nouser ) [LoginPW] => Array ( [$ne] => nopass ) ) 这样的语句在数据库中执行的结果又是什么呢? ![]() 其实上面的查询语句换成SQL语句那就是: SELECT * FROM USER WHERE LoginID != ‘nouser’ AND LoginPW != ‘nopass’ 这样一来查询语句就会把匹配这条语句的结果返回,那么一条本应该返回空结果的查询就变成了返回一个存在的结果,这样就导致了注入的产生。下面是测试的效果。 ![]() 想了解跟多请关注我们APTNO1.COM 本文由:东巽科技原创转载请著名 (责任编辑:蜗蜗侠) |