一些常见的 MongoDB 中的 NoSQL 注入攻击如下所示。
1. 基本的 NoSQL 注入攻击
#### 示例
假设有以下代码,用于查找特定用户:
```javascript
let username = req.body.username; // 假设来自用户输入
db.collection('users').find({ username: username });
```
如果攻击者输入 `username` 为 `{"$ne": null}`,这样就会找到所有用户,因为 `$ne` 操作符代表“不是”条件。
这样就有可能查出所有的用户。
以下在订单表中,本来想查某个用户的订单,就有可能被人查所有的用户订单。
db.orders.find({ name: {"$ne": null} })
如何有效的防止,NoSQL注入攻击。 以下是一个比较好的方案。
使用Java ORM Bee.
ORM Bee 互联网新时代的Java ORM框架,支持Sharding;JDBC,Android,HarmonyOS;支持多种关系型数据库,还支持NoSQL的Cassandra,Mongodb等;更快、更简单、更自动,开发速度快,运行快,更智能!
以下直接上源码。
1. pom.xml
<dependency>
<groupId>org.teasoft</groupId>
<artifactId>bee-all</artifactId>
<version>${bee.version}</version>
</dependency>
//bee.version 可以是: 2.4.2
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.6.1</version>
<scope>provided</scope>
</dependency>
2. 添加数据库配置(bee.properties)
#bee.db.dbName=MongoDB
bee.db.url = mongodb://localhost:27017/bee/
bee.db.username =
bee.db.password =
3. 写一个Java类测试
package org.teasoft.exam.bee.mongodb;
import java.util.List;
import org.teasoft.bee.osql.api.SuidRich;
import org.teasoft.exam.bee.mongodb.entity.Orders;
import org.teasoft.exam.comm.Printer;
import org.teasoft.honey.osql.shortcut.BF;
public class MongodbBugTest {
public static void main(String[] args) {
test();
}
public static void test() {
SuidRich suidRich = BF.getSuidRich();
Orders orders=new Orders();
// orders.setName("mongodb6");
String str="{\"$ne\": null}";
System.out.println(str);
orders.setName(str);
List<Orders> list;
list=suidRich.select(orders);
System.err.println(list.size());
Printer.printList(list);
}
}
4. 打印日志
[INFO] [Bee] db.orders.find({"name": "{\"$ne\": null}"})
[INFO] [Bee] | <-- select rows: 0
可以看到,没有查询到记录。成功防止注入。
源码地址: