漏洞简介
注意到该页面url处的id参数,该参数处就存在一个MongoDB的注入点。
此外,题目还给予了我们源码,如下所示:
漏洞复现
要对该站点进行SQL注入,首先需要研究该站点的源码。从该站点源码可以看出,我们传入的id参数的数据直接拼接到了MongoDB的数据查询语句中,这样我们就可以通过控制id参数的方式,来进一步实现SQL注入。此外,注意到下方倒数第三、四行处,可以看出显示的字段为title和content。
基于上述源码,与MySQL数据库的SQL注入方式相同,我们先闭合之前的查询语句,并且插入我们自己的查询语句。从query参数的构造可以看出,我们需要使用
'})
来进行闭合,之后,我们只需要写一个return语句,来返回我们所需要的内容。这样,无论id参数后面查询了什么,由于只返回我们构造的return的内容,因此原来的查询结果不会对我们的SQL注入返回造成影响。
我们依据上述原理,构造id参数如下所示:
id=1%27});%20return%20({title:1,content:%272
从上述结果可以看出,我们构造的payload可以成功在页面上回显。
之后,我们首先来查看MongoDB数据库中有哪些数据表。将上述payload中的title内容(也可以是content)换成tojson(db.getCollectionNames()),其中db.getCollectionNames()是MongoDB数据库中用于查询数据表的函数,tojson()函数是将其转换成json格式返回。
修改后的payload如下所示:
id=1%27});%20return%20({title:tojson(db.getCollectionNames()),content:%271
最后,我们需要查询数据表内的数据,我们猜测Authority_confidential为记录用户名、密码的数据表(当然了,如果猜不对还可以测试别的表),因此我们来查询该数据表内的数据,MongoDB数据库的数据表查询位db.Authority_confidential.find(),根据该语句构造的payload如下所示:
id=1%27});%20return%20({title:tojson(db.Authority_confidential.find()[1]),content:%271
解密拿到key