如何mongodb 攻击名单MongoDB

MongoDB安全,php中的注入攻击
作者:红黑联盟
分类 : 比特网
  在讨论MongoDB注入之前,我们必须要了解它到底是什么,以及我们之所以相较于其他更偏爱它的原因。因为MongoDB不使用SQL,所以人们就假想它不容易受到任何形式的注入攻击。但是相信我,没有什么东西生来就内置防护。我们还是要设置一些逻辑代码来防止攻击。
  MongoDB是什么?
  简单来说,MongoDB是MongoDB公司开发的一个开源数据库,可以以不同结构的类似于JSCON文档的形式文件。相关的会被存储在一起,这样有利于使用MongoDB查询语言进行快速查找。
  为什么要使用MongoDB?
  因为大家都想要快速查询,所以MongoDB非常受欢迎。它的性能非常好(1000millionsquries/秒)。它更受欢迎的另一个原因就是它擅长在很多相关数据库不能很好适应的案例中发挥作用。例如,非结构化的应用程序、半结构化和多态或是可伸缩性要求高并且拥有多个的应用程序。
  到此为止吧!如果在运行任何开源式应用程序的话,为了防止糟糕的情况发生,还是到此为止吧。我们为开源项目提供一种免费的渗透测试。在这里提交应用程序吧,我们会进行评价。
  让我们来看一下注入攻击
  第一种情况下,我们有一个PHP脚本,该脚本可以显示一个特定ID的用户名和对应密码。
  在上面的脚本中可以看到数据库名称是安全,集合名称是用户。U-id参数会由GET算法获得,然后将其传递到数组,之后就会给出相关结果。听上去很好?我们试着放入一些比较运算符和数组。
  糟糕!!它得出的结果是整个数据库。问题到底出在哪呢?这是因为输入了http://localhost/mongo/show.php?u_id[$ne]=2,创建了下面这种MongoDB查询,$qry= array(“id” =& array(“$ne” =& 2))。所以它显示了除id=2之外的所有结果,可以从截屏1中看到。
  让我们来考虑一下另一种情况,在前期脚本的工作内容是一样的,但是我们会用findOne方法来创建MongoDB查询。
  首先我们来看一下findOne的工作原理。此方法有下列语法:
  db.collection.findOne(查询、投影)
  这将返回到满足指定查询条件的文档。例如,我们需要找到与id=2相关的结果,就会出现下列命令:
  现在让我们看一下源代码:
  这里的关键点就是在某种程度上打破查询,然后再修复它。那如果我们键入以下查询,又会发生什么呢?
  这会打破查询并返回所需参数。让我们来检查一下输出:
  这带来了两个错误,但是这只是因为我们想要访问两个不存在的参数吗?这种错误间接地表明,用户名和密码在数据库中是一种参数,而这就是我们想要的结果。
  只要我们键入正确的参数,错误就会消除。
  现在我们想要找出数据库名称。在MongoDB中,用于查找数据库名称的方法是db.getName() 。因此查询就变成了:
  为了将此数据库转储,我们首先要找出集合的名称。在MongoDb中,用于查找集合名称的方法是db.getCollectionNames()。
  所以到现在为止,我们已经得到了数据库和集合的名称。剩下的就是要找到用户名集合,做法如下:
  同样的,我们可以通过改变内部函数db.users.find()[2]来获得其他的用户名和密码,比如说:
  既然大家都对MongoDb很熟悉,那么大家可能会想要了解相关的预防措施。
  让我们考虑一下第一种情况,参数在数组中传递。要想防止这种注入,我们可能需要停止执行数组中的比较运算符。因此,其解决之一就是用下列方式使用implode()函数:
  implode()函数返回值是一个字符串数组。因此我们得到的只会是一个对应特定ID的结果,而不是所有结果。
  在第二种情况中,我们可以使用 addslashes() 方法来保证查询不被攻击者打破。使用正则表达式来替换特殊符号是一个好主意。可以使用下列的正则表达式:
  $u_name =preg_replace(‘/[^a-z0-9]/i’, ‘\’, $_GET[‘u_name’]);
  这样之后,如果我们试图打破查询,它就不会再重蹈覆辙。
[ 责任编辑:小石潭记 ]
比特网 09:26:36
带着朋友和机器人上月亮散步
比食人鱼更恐怖:长着人类牙齿的鱼
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。MongoDB注入:如何攻击MongoDB? - 推酷
MongoDB注入:如何攻击MongoDB?
不管是商业项目还是个人项目,MongoDB都是一个非常好的数据库引擎,国内很多公司也开始用MongoDB。比起传统的数据库,这款数据库比较新,也有很多安全问题是大家还没有意识到的,而这些问题通常可以打得你措手不及。
本篇文章主要向大家介绍我在使用MongoDB的过程中遇到的问题,以及它是如何被用来修改数据库记录的。当然,利用过程很简单,不过其实各种方式的SQL注入技术说破了也就那么回事,但是依然有很多人容易犯这样的错误。
在我们开始前,我想先介绍下关于以下要用到的MongoDB的特性。MongoDB提供的更新机制是先定位到该文档,然后进行更新,如下例子:
name:&John&,
如上面的记录,你可以通过以下语句对它进行更新:
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 = &&&
&html&&head&&/head&&body&
&form method=&POST&&
&input type=&text& name=&username& placeholder=&Username&&
&input type=&text& name=&password& placeholder=&Password&&
&input type=&text& name=&firstname& placeholder=&Firstname&&
&input type=&text& name=&lastname& placeholder=&Lastname&/&
&input type=&text& name=&age& placeholder=&Age&&
&input type=&submit& value=&Submit&&
&/form&&/body&&/html&
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 &&h1&Search for someone&/h1&&form method='GET'&&input name='name' type='text' placeholder='First Name'&&input name='lastname' type='text' placeholder='Last Name'&&input type='submit'&&/form&&
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 &{}&form&&input name='name' type='text' placeholder='First Name'&&input name='lastname' type='text' placeholder='Last Name'&&input type='submit'&&/form&&.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})
session['_id'] = str(check)
return rediirect(&/?name={}&.format)
return &Invalid Login&
return &&h1&Login&/h1&& + 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 &&h1&Signup&/h1&& + 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 &&h1&Settings&/h1&& + 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 &&&&h1&Search user by secret key&/h1&
&form method=&post&&&input type=&text& name=&secret_key& placeholder=&Secret Key&/&&input type=&submit& value=&Serach&/&&/form&
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注入一样,我们要做的就是过滤传入的参数。
好了,就酱紫啦~
*参考来源:
,FB小编东二门陈冠希编译,转载请注明来自FreeBuf黑客与极客()
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致当前位置:
数万个 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 攻击 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信