MongoDB注入:如何攻击MongoDB?

Man59R 4年前
   <p>不管是商业项目还是个人项目,MongoDB都是一个非常好的数据库引擎,国内很多公司也开始用MongoDB。比起传统的数据库,这款数据库比较新,也有很多安全问题是大家还没有意识到的,而这些问题通常可以打得你措手不及。</p>    <p>本篇文章主要向大家介绍我在使用MongoDB的过程中遇到的问题,以及它是如何被用来修改数据库记录的。当然,利用过程很简单,不过其实各种方式的SQL注入技术说破了也就那么回事,但是依然有很多人容易犯这样的错误。</p>    <p>在我们开始前,我想先介绍下关于以下要用到的MongoDB的特性。MongoDB提供的更新机制是先定位到该文档,然后进行更新,如下例子:</p>    <pre>  {    name:"John",    info:{        age:65    }  }</pre>    <p>如上面的记录,你可以通过以下语句对它进行更新:</p>    <pre>  db.people.update({"name":"John"}, {"$set":{"info.age":66}})</pre>    <p>是不是很酷炫,好吧,知道大家早就懂了 <img src="https://simg.open-open.com/show/b02b858b2016182f9cd9e779e547de5e.jpg"></p>    <p>但是,如果子键不是硬编码的,又该如何呢?我们该如何通过变量将内容传进去呢?如下:</p>    <pre>  keyName = request.form|'keyName'|  keyData = request.form|'value'|  db.people.update({"name":"John"}, {"$set":{"info.{}".format(keyName):keyData}})</pre>    <p>后台程序从前端请求中获取到key和value的值以后,通过参数传入MongoDB的更新函数中。那么问题来了,如果前端输入的是一个恶意的参数呢。</p>    <p>以下是我在处理一个未知用户输入时候产生的问题,为了说明,接下来我们写一段用来展示这个漏洞。代码如下:</p>    <pre>  from flask import *  import pymongo  import bson  import uuid     db = pymongo.MongoClient("localhost", 27017).test     form = """</pre>    <p>来自: <a href="/misc/goto?guid=4959670732232937890" rel="nofollow">http://www.freebuf.com/articles/network/101494.html</a></p>