如何mongodb 漏洞攻击MongoDB

如何攻击Hacking MongoDB
不管是商业项目还是个人项目,MongoDB都是一个非常好的数据库引擎,国内很多公司也开始用MongoDB。比起传统的数据库,这款数据库比较新,也有很多安全问题是大家还没有意识到的,而这些问题通常可以打得你措手不及。
本篇文章主要向大家介绍我在使用MongoDB的过程中遇到的问题,以及它是如何被用来修改数据库记录的。当然,利用过程很简单,不过其实各种方式的SQL注入技术说破了也就那么回事,但是依然有很多人容易犯这样的错误。
在我们开始前,我想先介绍下关于以下要用到的MongoDB的特性。MongoDB提供的更新机制是先定位到该文档,然后进行更新,如下例子:
& name:&John&,
&&&&& age:65
如上面的记录,你可以通过以下语句对它进行更新:
db.people.update({&name&:&John&}, {&$set&:{&info.age&:66}})
是不是很酷炫,好吧,知道大家早就懂了
但是,如果子键不是硬编码的,又该如何呢?我们该如何通过变量将内容传进去呢?如下:
keyName = request.form|'keyName'|
keyData = request.form|'value'|
db.people.update({&name&:&John&}, {&$set&:{&info.{}&.format(keyName):keyData}})
后台程序从前端请求中获取到key和value的值以后,通过参数传入MongoDB的更新函数中。那么问题来了,如果前端输入的是一个恶意的参数呢。
以下是我在处理一个未知用户输入时候产生的问题,为了说明,接下来我们写一段用来展示这个漏洞。代码如下:
from flask import *
import pymongo
import bson
import uuid
db = pymongo.MongoClient(&localhost&, 27017).test
form = &&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
app = Flask(__name__)
app.secret_key = &secret&
@app.route(&/logout/&)
def logout():
&&& session.pop(&_id&)
&&& return redirect(&/login/&)
@app.route(&/&)
def index():
&&& if &_id& not in session:
&&&&&&& return redirect(&/login/&)
&&& name = request.args.get(&name&)
&&& lastname = request.args.get(&lastname&)
&&& if not name:
&&&&&&& return &Search for someone&
&&&&&&& search_results = db.members.find_one({&{}&.format(name):lastname})
&&&&&&& if search_results:
&&&&&&&&&&& search_results = name + & & + lastname + & is & + search_results['account_info']['age'] + & years old.&
&&&&&&& return &{}&.format(search_results)
@app.route(&/login/&, methods=['GET', 'POST'])
def login():
&&& if request.method == &POST&:
&&&&&&& username = request.form['username']
&&&&&&& password = request.form['password']
&&&&&&& check = db.members.find_one({&username&:username, &password&:password})
&&&&&&& if check:
&&&&&&&&&&& session['_id'] = str(check)
&&&&&&&&&&& return rediirect(&/?name={}&.format)
&&&&&&& else:
&&&&&&&&&&& return &Invalid Login&
&&& return &Login& + form
@app.route(&/signup/&, methods=['GET', 'POST'])
def signup():
&&& if request.method == &POST&:
&&&&&&& username = request.form['username']
&&&&&&& firstname = request.form['firstname']
&&&&&&& lastname = request.form['lastname']
&&&&&&& password = request.form['password']
&&&&&&& age = request.form['age']
&&&&&&& session['_id'] = str(db.members.insert({&username&:username, &password&:password, firstname:lastname, &account_info&:{&age&:age, &age&:age, &isAdmin&:False, &secret_key&:uuid.uuid4().hex}}))
&&&&&&& return redirect(&/&)
&&& return &Signup& + form
@app.route(&/settings/&, methods=['GET', &POST&])
def settings():
&&& if request.method == &POST&:
&&&&&&& username = request.form['username']
&&&&&&& firstname = request.form['firstname']
&&&&&&& lastname = request.form['lastname']
&&&&&&& password = request.form['password']
&&&&&&& age = request.form['age']
&&&&&&& db.members.update({&_id&:bson.ObjectId(session['_id'])}, {&$set&:{&{}&.format(firstname):lastname, &account_info.age&:age, &username&:username}})
&&&&&&& return &Values have been updated!&
&&& return &Settings& + form
@app.route(&/admin/&, methods=['GET', 'POST'])
def admin():
&&& if &_id& not in session:
&&&&&&& return redirect(&/login/&)
&&& theUser = db.members.find_one({&_id&:bson.ObjectId(session['_id'])})
&&& if not theUser['account_info']['isAdmin']:
&&&&&&& return &You do not have access to this page.&
&&& if request.method == &POST&:
&&&&&&& secret = request.form['secret_key']
&&&&&&& return str(db.members.find_one({&account_info.secret_key&:secret}))
&&& return &&&Search user by secret key
app.run(debug=True)
这个网站很简单。就是一个登陆页面,一个注册页面,一个设置页面,和一个index页面,用户可以在这些页面上输入他/她们的姓名,然后返回年龄,如下图。
需要注意的是,这段代码是很容易受到注入攻击的,接下来,我们来看看是如何进行注入的。
我们的目标是获得访问admin页面的权限。从网站代码中我们可以找到,后台是根据isAdmin字段来验证用户权限的,如下图
看一下后台的数据库大概是这样的:
其中,Firstname:Lastname是直接插入姓名的,看着很奇怪。
我们先创建一个用户,然后访问下/admin/页面,返回如下:
很好&&果然没有权限访问。回顾下isAdmin可以用来控制该页面,也就是说,该用户在数据库中可能是这样的:
其中,firstname:lastname这一条是我们可控的,通过settings页面输入进去的,&username&, &password&, &firstname&, 和&lastname&实际上都是我们可以输入的,firstname:lastname在查询的时候是可以搞的,看起来似乎可以搞些文章。
把fistname改成account_info.isAdmin 并且把lastname改成&1 &,1在python中代表的就是True。
点击Submint,发现修改成功了。
访问/admin/页面:
可以访问admin页面了,:D
同样的,要想用secret key查整个内容的话,可以这么做:
输入查询:
到此处,事实上我们能做的还有很多很多。我们可以用它来修改其他用户的账号密码,并且查看其他用户。在这里不多介绍。
很显然,这个网站的所有安全措施都没用了,敏感数据也变得危险。当然,当你的网站被攻击后,回过头来看代码,也许你会觉得自己的代码很搞笑,但这是绝对不容忽视的。好吧,其实我也犯过这样的错误,还好及时发现。
和关系型数据库的SQL注入一样,我们要做的就是过滤传入的参数。
顶一下(0) 踩一下(0)
热门标签:当前位置:
数万个 MongoDB 被攻击,数据库被删
近期评论文章归档
数万个 MongoDB 被攻击,数据库被删
更多的黑客蜂拥而至,被劫持的MongoDB数据库数量随之增加。
由于现在涉嫌企图劫持MongoDB的黑客团伙从一个增加至三个,预计更多的团伙会在接下来几天纷纷加入其中,MongoDB管理员们在数据库管理实践方面将结结实实地上一堂课。
这个周一,Bleeping Computer网站爆出新闻:一个自报家门是Harak1r1的黑客/团伙接管了管理员帐户没有设置密码的连接至互联网的MongoDB数据库。
这个团伙导出数据库的内容,将所有表换成名为WARNING(意为“警告”)的一个表,里面有一封勒索信,要求中招数据库的所有者往比该团伙的特币钱包打入0.2个比特币(约合200美元)。
在我们刊发这篇文章时,Harak1r1已劫持了1800多个MongoDB数据库,11个受害者如数支付了赎金,以换回文件。
随着时间的推移,Harak1r1劫持了更多的数据库,劫持的MongoDB数量一度超过3500个,目前高峰时期超过800个。
在这些受害者当中,黑客甚至钓到了一条“大鱼”:艾默里医疗集团(Emory Healthcare),这是一家总部位于美国的医疗保健组织。
据MacKeeper安全研究团队声称,Harak1r1把艾默里医疗集团洗劫一空,阻止该集团访问200000多个医疗记录。
第二个团伙加入进来
来自harak1r1的攻击又持续了两天,但是随着全球信息安全媒体开始竞相报道这个话题,两个跟风者浮出水面,开始如法炮制。
第二个团伙化名为0wn3d,他们采用的手法是,把劫持而来的数据库表换成名为WARNING_ALERT的表。
据在圣诞节前后最早发现第一个被黑MongoDB数据库的研究人员维克托·格弗斯(Victor Gevers)声称,这第二个团伙已劫持了930多个数据库。
不像Harak1r1,这第二个团伙来得更贪婪一点,索要0.5个比特币(约合500美元),但是这还是没有阻止许多公司支付赎金;0wn3d的比特币钱包显示,至少三个受害者已乖乖支付了赎金。
发现第三个团伙
一天后,同样由格弗斯发现了第三个黑客,使用asdf这个化名,似乎已攻陷了740多台MongoDB服务器。
这个黑客/团伙索要0.15个比特币(约合150美元),他使用了一封内容更长的勒索信,他在信中告诫受害者:如不配合,他们的数据库内容将发布到互联网上。
此外,这个威胁分子似乎对受害者要求更苛严,限定数据库所有者必须在72小时内支付赎金。
支付赎金并不意味着受害者就可以拿回数据。
据格弗斯声称,由于这三个团伙开始使用内容更多样的勒索信和不同的比特币地址,让他得以跟踪查明这些团伙活动的思路在慢慢模糊起来。
此外,在这些攻击更新颖的变种当中,黑客们似乎懒得拷贝中招的数据库。在最近的几次攻击中,格弗斯表示,骗子们索性删除了数据库的内容,照样索要赎金,希望没人检查日志,没人发现他们的所作所为。
争夺MongoDB的地盘战刚开始
但是坏消息并不仅限于此。据格弗斯声称,这些团伙如今在争抢同一块地盘,其中许多人在改写对方的勒索信。
因此导致出现了这种情况:数据库的所有者把赎金付错对象,结果付给不该支付的团伙,对方自然无法归还内容。
格弗斯近日告诉Bleeping Computer网站:“这引起了坏人的注意,更多的玩家加入进来,打算趁机浑水摸鱼。这是件坏事。”
这位研究人员补充说:“虽然如此,但是这可能不会促使MongoDB的所有者开始修复门户敞开的MongoDB数据库。”他提到,大量未受到保护的MongoDB服务器连接到互联网上。
格弗斯补充道:“Shodan上的MongoDB总数量仍在增加,ZoomEye显示有90000多台服务器的门户敞开。AWS安全团队接到了潮水般涌入的帮助请求。”他本人忙于为遭到这些攻击的公司提供技术援助。
攻陷指标(IOC)
这张表现在出现在谷歌文档(Google Docs)上,现在由尼尔·梅里根(Niall Merrigan)和维克托·格弗斯共同管理。
下面这张表总结了与MongoDB勒索攻击有关的所有详细信息。这张表极有可能不完整。如果你有任何新的详细信息,欢迎联系我们。
电子邮件地址
比特币地址
被替换数据
已知的IP地址
harak1r1@sigaint.org
13zaxGVjj9MNc2jyvDRhLyYpkCh323MsMq
1MMA6YD99vAfzKqhrb3dY91KpSZV6TMd2x
14VaE8NpTBTvx8k4SmteYKwPiu2YeWmuhh
92.99.14.92.99.14.3
Mongo3l1t3
mongo3l1t3@sigaint.org
1j4ocBecBanTwjLsxLfiE7iWjMJGHdZGB
193.107.145.20
15b7bS8tUg8NpzX2FRJQskEFjWRDg9gy6f
WARNING_ALERT
185.106.120.159
asdf@signaint.org
18eUPJLM79zdXKYWZSzT29fBQScFwU81VR
95.211.184.210
*** 1月6日,Mongoel1t3团伙后来居上,攻击势头超过Harak1r1攻击。这回,攻击者没有导出数据库,没有拷贝就直接更换数据库。
云头条编译|未经授权谢绝转载MongoDB 被攻击风波未平,如何避免黑客入侵?
从“一文可以看到,近日境外勒索集团黑客正大规模利用企业使用 MongoDB 开源版时的配置疏漏进行入侵,给自建 MongoDB 数据库服务的企业造成不小的安全隐患。目前对于该事件的讨论非常多,各企业和各方大拿也给出了自己的看法和解决建议。以下是发布的文章,在此选取了部分精彩内容并分享给大家:问题出在哪里?阿里云安全团队发现,受害用户都有一个共同的特征:所有被入侵的 MongoDB 数据库均可以在任何网络环境,不使用账号直接登录。再说得更通俗一点,这就是把家门全部敞开,没有任何安全防护措施,业务直接裸奔在互联网上,黑客可以来去自如,用低成本的方式做任何想做的事情,包括数据库删除这样的高危操作等。如何解决?MongoDB官网公告表示:这些入侵完全可以通过开源产品内置的安全机制防御。针对在ECS上通过MongoDB开源版自建数据库的企业,建议相关管理员登录云盾控制台,使用云盾安骑士MongoDB检测是否存在此安全问题。当然,也可以手动排查险情:1.&&& 检查MongDB帐户以查看是否有人添加了密码(admin)用户(使用db.system.users.find()命令);2.&&& 检查GridFS以查看是否有人存储任何文件(使用db.fs.files.find()命令);3.&&& 检查日志文件以查看谁访问了MongoDB(show log global命令)。
MongoDB 的详细介绍:
MongoDB 的下载地址:
转载请注明:文章转载自 开源中国社区
本文标题:MongoDB 被攻击风波未平,如何避免黑客入侵?
本文地址:
哪有有你!虽然我不是node粉,但mongoDB配置有问题,跟node有毛关系?!跟PHP有毛关系?~!
不够,/knowledge_detail/37451.html
引用来自“fuiyu”的评论然后,复制粘贴,复制粘贴node粉连复制粘贴命令都不会,全栈?这就尴尬了.
然后,复制粘贴,复制粘贴
引用来自“乐猪”的评论哈哈哈
666666666666
引用来自“名字真不好起”的评论哪有有你!虽然我不是node粉,但mongoDB配置有问题,跟node有毛关系?!跟PHP有毛关系?~!node粉说:先有node,后有php先有php,后有天,这是共识.你说node粉狂不狂?
哪有有你!虽然我不是node粉,但mongoDB配置有问题,跟node有毛关系?!跟PHP有毛关系?~!MongoDB数据库遭受疯狂勒索攻击 数小时内受害者达2.7万人_黑客技术
记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华
攻击者通过入侵,将未打补丁或有配置问题的数据进行复制、删除操作。
管理员被勒索赎金以交换回被盗数据,最初的攻击由名为Harak1r1的黑客发起,叫价0.2比特币(约合184美元)赎回数据。从周三他的攻击被公之于众至今,支付赎金的站长由16人增加至22人。
付款被设计成受害者主动做慈善的形式。
位于挪威的安全研究专家、微软开发者Niall Merrigan认为攻击由之前12000人次飙升至如今的27633次,历时仅约12个小时。
Merrigan和他的同事锁定了其中15名很明显的攻击者,其中一人用代号kraken0的邮箱攻击MongoDB15482次,要求1比特币(921美元)作为换回数据的赎金。至今没人支付这笔钱,Merrigan说他正在调查攻击者涉及的OSINT与不同的输入输出控制系统。
他认为同僚Victor Gevers在帮助受害者保护其暴露在MongoDB数据库的数据方面做的很好,目前为止共有118人的数据受到了保护。
Gevers透露,有多达9.9万MongoDB用户成为潜在受害对象。
MongoDB的安全性一直是个问题:直到最近,该软件的默认设置都处在不安全状态。Shodan搜索引擎创始人John Matherly于2015年就警告超过30000人在MongoDB上的数据没有防护,属于对互联网公开的状态。
澳大利亚电信公司和新西兰的媒体 Media Authority 在2015年七月被报告其MongoDB暴露在网上。
由AISI发布的检测数据显示,每日约有400起暴露的MongoDB数据库服务,其中90%由澳大利亚网络运营商提供服务。
AISI统计的每日暴露在互联网上公开服务的数量
Bruce Mattews,来自网络安全机构与主动通信执法机关的主管告诉Vulture South他们掌握澳大利亚超过90%的IP地址段,目前此地MongoDB暴露用户数量比较稳定。
“我们向AISI报告能够传递信息给服务商的那些公开又有漏洞的服务”,Mattews说,“信息能够被传递这至关重要,很多暴露的MongoDB数据也许是用于测试但保护他们的安全仍是必要的。”
阅读:22376 | 评论:0 | 标签:
想收藏或者和大家分享这篇好文章→
? 关注Hackdig微博,点击下方按钮?
? 关注Hackdig微信,学习技术更方便NoSQLAttack - MongoDB默认配置攻击和注入攻击工具_mongodb吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,521贴子:
NoSQLAttack - MongoDB默认配置攻击和注入攻击工具收藏
这是我写的一个mongoDB的注入工具,最简化用户操作来实现mongoDB默认配置攻击和注入攻击。使用这个工具就可以发现有成千上万的mongoDB裸奔在互联网上,并且数据可以随意下载欢迎交流Github:
京东电脑节,全民抢宝进行时!1999抢i7本,半价秒电脑,抢直降3000显示器
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 mongodb 漏洞攻击 的文章

 

随机推荐