Spring Data MongoDB nosql 注入

问题描述 投票:0回答:2

我有一个问题。 Spring Data 中的 mongo 存储库中的查询是否可以免受 NoSQL 注入攻击?是否有可能成功地对 spring-boot 应用程序执行此类攻击?例如,如果我创建用我自己的方法扩展 MongoRepository 的接口,默认查询是否以安全的方式生成,这样的攻击是不可能的?谢谢

java mongodb spring-boot spring-data-mongodb
2个回答
6
投票

我使用一个 mongo 存储库创建了小型 Spring Boot 应用程序。我对其进行了一些基本的 NoSQL 注入攻击,为了确保它们有效,我还使用 Robo3T 进行了攻击,并检查输出是否符合我的预期。例如,进行如下查询:

db.getCollection('user').find({
"login":"f1", 
"password" : { '$ne': null } })

会给我数据库中存在的具有该登录名的所有用户。 我通过对 String 字段类型执行这样的 { '$ne': null } 来进行此攻击。(我还对其他类型进行了一些其他攻击,但稍后我会解释我的其他结论)正如我所想的那样,这样,它就是不可能提供我们自己的命令。春天让这看起来像:

"password":"{ '$ne': null }"

并且每当我们尝试以“”结束它时,它只会将 \ 添加到我们的查询中,例如:

{ "login" : "f1", "password" : "\"end earlier\"" }

我还检查了其他请求(主要来自这里:https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt因为我在这里找到了它https://www.owasp.org/index .php/Testing_for_NoSQL_injection,也许这些链接会对某人有所帮助),但是没有一个成功。因此,就我而言,他们已经为 NoSQL 注入等案例做好了准备,并且确保了它的安全。但是,如果有人能够支持或不同意我的观点(基于执行的攻击)并提供更多证据或示例,我将不胜感激。 谢谢。


0
投票

我想知道您是否找到了解决方案。我还在 Spring Boot 中创建了 nosql 注入。

public boolean loginUser(String username, String password) throws MongoQueryException {
    User user = new User();
    user.setUsername(username);
    user.setPassword(passwordEncoder.encode(password));
    
    BasicDBObject query = new BasicDBObject();
    String qry = String.format("this.username == '" + user.getUsername() + "' && this.password == '" + user.getPassword() + "'");
    query.put("$where", qry);
    
    System.out.println(query.toString());

    MongoCursor<Document> cursor = collection.find(query).iterator();

    while (cursor.hasNext()) {
        Document doc = cursor.next();
        System.out.println("Document: " + doc.toString());
        return cursor.hasNext();
    }
    return cursor.hasNext();
}

当我尝试时:admin'|| 1==1“} //

System.out.println(query.toString()); 的输出

{"$where": "this.username == 'admin' || 1==1 "} // ' && this.password == '46edfd10b459ca40bc16efe7aafbfr5651f0'"}

\ 总是被添加

© www.soinside.com 2019 - 2024. All rights reserved.