MongoDB安全 – PHP注入检测

什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库。MongoDB是个开源的NoSql数据库,其通过类似于JSON格式的数据存储,这使得它的结构就变得非常自由。通过MongoDB的查询语句就可以查询具体内容。 为什么使用MongoDB 其实大部分原因只是因为MongoDB可以快速查找出结果,它大概可以达到10亿/秒。当然MongoDB很流行的另外一个原因是在很多应用场景下,关系型数据库是不适合的。例如,使用到非结构化,半自动化和多种状态的数据的应用,或者对数据可扩展性要求高的。 我们正在为开源项目提供免费测试,如果你想测试下你的开源程序,请点击这里。 案例分析 第一个例子,我们有一个PHP页面。主要实现通过变量id获取到该id的username和password: 从代码可以知道,数据库名是security,集合名是users。u_id 是通过GET请求传到后台,然后传入一个数组变量中。然后进入MongoDB的查询。我们试试通过数组传入运算符号 返回了数据库中的所有内容。看看我们传入的数据: http://localhost/mongo/show.php?u_id[$ne]=2 传入后的MongoDB查询语句如下: $qry= array(“id” => array(“$ne” => 2)) 这样MongoDB就返回了除了id=2的其他所有数据。 让我们看看另一种情况,通过脚本实现同样的功能。不同的是,我们在后台用MongoDB中的findOne来查询结果。 我们先来快速看下MongoDB中的findOne方法: db.collection.findOne(query, projection) 返回了所有满足查询条件的文档中的第一个文档。当我们想要查询id=2的文档,输入以下语句:

我们看下代码: 这里的关键就是破坏原有的查询语句,再重新执行一个查询语句。 能想象以下请求会在MongoDB中执行怎样的操作吗? http://localhost/mongo/inject.php?u_name=dummy’});return{something:1,something:2}}//&u_pass=dummy 我们将原有的查询闭合,然后返回了一个想要的参数:

注意报错信息中的username和password这两个字段,那么我们就把刚刚的注入语句改上username和password 参数。如下 在MongoDB中,db.getName()方法可以查到数据库的名字,我们可以构造如下参数: mangodb中通过db.getCollectionNames()就能知道数据库中用的用户:

目前为止我们得到了数据库名和集合名。现在需要做的就是获取到users集合中的数据,可以构造如下语句:

我们可以用过改变参数来遍历整个数据库,例如改成 db.users.find()[2]:

防御 第一个例子中的遍历是传递给一个数组的(array)。防御这种注入的话,我们总得先防止数组中的运算操作。因此,其中一种防御方法就是implode()方法:

implode()函数返回由数组元素组合成的字符串。这样的话,我们就只能得到一个对应的结果

第二个例子可以使用addslashes()函数,这样的话攻击者就不能破坏查询语句了。同时,用正则表达式把一些特殊符号替换掉也是一个不错的选择。你可以使用如下正则: $ u_name =的preg_replace('/ [^ A-Z0-9] / I','\',$ _GET ['u_name']);

再尝试就没有报错信息了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知识分享

(一)Lua脚本语言入门

今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写...

43270
来自专栏mwangblog

Linux中的管道命令(一)

21340
来自专栏lgp20151222

idea报错:Error running $classname: Command line is too long. Shorten command line for $classname.

打印的变量太长了,超过了限制,这都会报错...我只想知道idea基于什么原理会报这个错...

1.3K30
来自专栏程序员互动联盟

【专业技术】C语言EOF如何使用?

存在问题: 又一次遇到有人问EOF的用法,到底如何来使用那? 解决方案: 这里有一篇文章写的不错,希望对EOF没有理解的同学能有所帮助。 我学习C语言的时候,遇...

42680
来自专栏dizhiling专栏

一行命令实现cpu占用率100%

cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.

13510
来自专栏Redis

Redis数据类型之hashes类型

2、hsetnx 设置hash field为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是not exist的意思。

13000
来自专栏CaiRui

Python之简单的用户登录和注册

#!/bin/bash/env python # -*- coding:utf-8 -*- def login(username,password): ...

462100
来自专栏深度学习与计算机视觉

Python 新建文件夹与复制文件夹内所有内容

在指定路径下新建一个文件夹: import os def newfile(path): path=path.strip() path=path....

24360
来自专栏程序员同行者

redis命令总结

16940
来自专栏十月梦想

Express框架之中间件(一)

如果我的的get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。

9020

扫码关注云+社区

领取腾讯云代金券