如何启动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注入一样,我们要做的就是过滤传入的参数。
好了,就酱紫啦~
欢迎加入我的QQ交流群
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1568130次
积分:13890
积分:13890
排名:第770名
原创:154篇
转载:602篇
评论:128条
(7)(30)(19)(1)(7)(71)(38)(24)(25)(19)(19)(11)(7)(1)(2)(10)(18)(21)(22)(80)(26)(28)(13)(16)(14)(42)(21)(7)(4)(18)(9)(12)(5)(12)(38)(4)(30)(28)爱上MongoDB的七大理由
发表于 16:36|
来源Newbridge Green|
作者Callum
摘要:MongoDB可能是现今NoSQL数据库中最著名的,但并不意味着MongoDB是完美的,在某些情况下,传统的关系数据库如MySQL和PostgreSQL更具优势。但MongoDB目前已经相当广泛,使用者们在充分享受它的灵活性。下面就让我们看看MongoDB惹人喜爱的七大优势。
MongoDB可能是现今NoSQL数据库中最著名的,但并不意味着MongoDB是完美的,在某些情况下,传统的关系数据库如MySQL和PostgreSQL更具优势。但MongoDB目前已经相当广泛,使用者们在充分享受它的灵活性。下面就让我们看看MongoDB惹人喜爱的七大优势。
1. 文档存储
数据存储以BSON/JSON文档,这对于Web应用程序有很大的意义。开发者API喜欢以JSON形式传输,这使得整个项目的数据表示可采用统一的模型。所有这一切都无需任何前期架构设计。
2. 可扩展性
MongoDB被用在一些规模庞大的环境中,FourSquare/Craiglist都在使用它。通过分片数据缩放处理理论上可实现更高的吞吐量。
3. 简单的复制
就像分片技术一样,MongoDB范围内复制过程同样简单好用,在副本机器上还有大量的复制选项。灵活的功能可满足用户应用的需求。
4. 易于查询
MongoDB以文档的形式存储数据,不支持事务和表连接。因此查询的编写、理解和优化都容易得多。简单查询设计思路不同于SQL模式,嵌入文档在特定的环境下可得到更好的查询,然而这需要先加入集合。如果需要执行多个请求到数据库则需要加入其到客户端。在MongoDB时ODM工具(如Doctrine2)将发挥自身的优势。
由于MongoDB客户端生成的查询为BSON对象,而不是可以被解析的字符串,所以可降低受到SQL注入的攻击的危险。最常见的攻击类型为针对Web应用程序的攻击,在MongoDB上使用可减轻攻击风险。
用户在选择数据库时总是喜欢积极和充满活力的,这点非常重要。MongoDB在业界有非常大的影响力,用户也会定期的组织活动。MongoDB的标签在StackOverFlow是非常活跃的。你永远不会陷入困境,因为总有人与你讨论并解决问题。
MongoDB是免费的!
原文链接:(李智/编译 张志平/审校)
推荐阅读相关主题:
网友评论有(0)
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 mongodb 注入攻击 的文章

 

随机推荐