Bußgeld-Kopfzeile

Nosql-Sicherheit: Risiken, NoSQL-Injection-Angriffe und Abwehrmaßnahmen verstehen

Nosql umfasst eine breite Palette nicht-relationaler Datenbanktechnologien, die in modernen Anwendungen zur Unterstützung flexibler Schemata und horizontaler Skalierbarkeit weit verbreitet sind. Trotz ihrer Vorteile sind NoSQL-Systeme nicht von Haus aus sicher - Entwickler müssen verstehen NoSQL-Injection-Schwachstellen, wie Angreifer sie ausnutzen können und wie man sich systematisch dagegen verteidigt. Dieser Artikel bietet eine eingehende technische Untersuchung für Sicherheitsingenieure, einschließlich realer Bedrohungsszenarien, Präventivstrategien, Codebeispiele und Verweise auf wichtige CVEs.

Was NoSQL ist und warum es für die Sicherheit wichtig ist

NoSQL-Datenbanken (kurz für "Not Only SQL" oder "nicht-relationales SQL") verzichten auf traditionelle relationale Modelle zugunsten von flexiblen Datenmodellen wie Key-Value-Stores, Dokumentenspeichern, spaltenbasierten und Graphdatenbanken. Beliebte Implementierungen sind MongoDB, CouchDB, Redis, Cassandraund Neo4j. Diese Systeme bieten Skalierbarkeit und Schemaflexibilität, aber sie führen auch neue Abfragesemantiken und Sicherheitslücken die für Ingenieure, die an SQL-Systeme gewöhnt sind, ungewohnt sind. vaadata.com

Im Gegensatz zu SQL hat jedes NoSQL-System seine eigene Abfragesprache (z. B. JSON-basierte Abfragen in MongoDB) und unterschiedliche Operator-Semantiken. Diese Vielfalt verbessert zwar die Flexibilität, führt aber auch zu einzigartige Angriffsvektoren für Injektionen weil Benutzereingaben oft ohne angemessene Bereinigung in Datenbankabfragen interpoliert werden. vaadata.com

NoSQL-Einschleusung: Was es ist und wann es auftritt

Im Kern tritt eine NoSQL-Injektion auf, wenn ein Angreifer Folgendes sendet handwerkliche Eingabe die die beabsichtigte Struktur einer Datenbankabfrage verändert. Im Gegensatz zur traditionellen textbasierten Grammatik der SQL-Injektion wird bei der NoSQL-Injektion häufig Folgendes missbraucht JSON-Payloads oder Abfrageoperatoren wie zum Beispiel $ne, $gt, $lt, $regex, oder $wo um die Logik zu manipulieren. vaadata.com

Beispiele und Szenarien aus der realen Welt

Betrachten Sie ein typisches Node.js + MongoDB-Authentifizierungs-Snippet, bei dem Entwickler direkt die Client-Eingabe zur Abfrage von Anmeldedaten verwenden:

javascript

// Anfällige Authentifizierung

db.users.find({

E-Mail: req.body.email,

Passwort: req.body.password

});

Ein Angreifer könnte einen Wert wie diesen eingeben:

json

{ "E-Mail": { "$ne": null }, "Passwort": { "$ne": null } }

Diese Abfrage gibt Dokumente zurück, bei denen die E-Mail lautet nicht null UND das Passwort ist nicht null, wodurch die Authentifizierung umgangen wird, ohne dass gültige Anmeldedaten bekannt sind. vaadata.com

Typische NoSQL-Datenbanken und wo Injektion auftritt

Datenbank-TypBeispieleRisiko der Injektion
DokumentenspeicherMongoDB, CouchDBHigh-JSON-Abfragen und JS-Ausführung
Schlüssel-WertRedis, DynamoDBMittlere Skriptauswertungen oder komplexe Operationen erfordern einen sorgfältigen Umgang
Spalten-FamilieCassandra, HBaseRisiko der Interpolation bei mittleren Abfragen
GrafikNeo4jHochabfragesprachen wie Cypher können manipuliert werden

Jedes Modell weist aufgrund der unterschiedlichen Abfragesprache ein anderes Risikoprofil auf. Zum Beispiel, MongoDB erlaubt Abfragen mit Operatoren wie $wo die beliebiges JavaScript ausführen, was die Angriffsfläche vergrößert. InfoQ

Nosql-Sicherheit

Hochwirksame CVE-Beispiele im Zusammenhang mit NoSQL Injection

Obwohl über NoSQL-Injections im Vergleich zu SQL-Injections eher wenig berichtet wird, zeigen dokumentierte Sicherheitsprobleme, dass sie sehr real sind. Zum Beispiel:

  • CVE-2024-48573: Eine NoSQL-Injektion in Aquila CMS ermöglichte einem Angreifer das Zurücksetzen von Konto-Passwörtern, da vom Benutzer bereitgestellte Filter nicht bereinigt wurden, was eine bösartige Operator-Injektion ermöglichte. vaadata.com

Andere gemeldete Fehler (z. B. Probleme mit $wo Missbrauch in ODMs) unterstreichen, dass Injektionsvektoren nicht nur aus Anwendungscode, sondern auch aus unsicherer Umgang mit Bibliotheken oder Schemata. Helle Sicherheit

Wie NoSQL Injection ausgenutzt werden kann

NoSQL-Injection-Angriffe haben je nach Datenbank und Sicherheitsposition unterschiedliche Auswirkungen. Sie können verwendet werden, um:

  • Umgehung der Authentifizierungslogik
  • Sensible Datensätze extrahieren
  • Ändern oder Löschen wichtiger Daten
  • Erhöhen Sie die Privilegien
  • Auslösen sekundärer Anwendungsschwachstellen (z. B. RCE über die Ausführung von JavaScript)

Beispiel: Umgehung der Authentifizierung

javascript

// Angreifer-Nutzdaten ändern Abfragelogik

db.users.find({

E-Mail: { $regex: ".*" },*

*Passwort: { $regex: ".*" }

});

Dies passt zu jedem Berechtigungsnachweis, denn .* ist eine Regex, die auf alles zutrifft und somit die Anmeldeprüfungen umgeht. vaadata.com

Erkennung von NoSQL Injection

Das Testen auf NoSQL-Injektion beinhaltet:

  • Identifizierung von Punkten, an denen Benutzereingaben direkt in Datenbankabfragen übernommen werden
  • Fuzzing von Benutzerparametern mit Operator-Tasten wie $ne, $gt, $lt
  • Beobachtung von Änderungen im Anwendungsverhalten (z. B. Umgehung der Authentifizierung, unterschiedliche Abfrageergebnisse)
  • Tests mit automatisierten Scannern und manuellen Pentesting-Techniken Indusface

Ingenieure verlassen sich oft sowohl auf manuelle Tests als auch auf automatisierte Tools, um bösartige Nutzlasten zu simulieren.

Defensiv-Strategien: Eingabevalidierung und Abfrageverhärtung

Das Wesentliche bei der Verteidigung gegen NoSQL-Injection ist die Behandlung alle Benutzereingaben als nicht vertrauenswürdig und beseitigt jede Möglichkeit, dass diese Eingabe die Abfragestruktur verändert.

Erkennung von NoSQL Injection

Bewährte Praktiken

  1. Eingabevalidierung und Whitelisting Lassen Sie nur erwartete Felder und Datentypen zu. Verwerfen oder bereinigen Sie Sonderzeichen und JSON-Operatoren, die die Abfragelogik verändern könnten. Indusface
  2. Parametrisierte/vorbereitete Abfragen Obwohl es bei NoSQL keine universellen vorbereiteten Anweisungen gibt, unterstützen viele Treiber sicherere Abfrageerstellungsprogramme, die eine Stringverkettung vermeiden.
  3. Schema-Validierung Verwenden Sie Dokumentenschemata oder Modellvalidierung (z. B. Mongoose-Schemata), um die erwarteten Eingabeformen durchzusetzen.
  4. Deaktivierung gefährlicher Operatoren Deaktivieren Sie die Auswertung von $wo, $evaloder die Ausführung von JavaScript in Datenbankkonfigurationen. Indusface
  5. Least-Privilege-Regelungen Schränken Sie die Berechtigungen der Datenbankbenutzer ein, so dass selbst bei einer Injektion der Aktionsradius der Operationen (Lesen/Schreiben) begrenzt ist.
  6. Protokollierung und Überwachung Protokollieren Sie ungewöhnliche Abfragemuster, um Injektionsversuche zu erkennen und Warnungen auszulösen.

Code-Beispiele: Angriffs- und Verteidigungspatterns

Nachfolgend finden Sie praktische Codeschnipsel, die sowohl die Ausnutzung als auch die Schadensbegrenzung veranschaulichen.

Angriff zur Umgehung der MongoDB-Authentifizierung

javascript

// Unsicher: Direkte Benutzereingabe in Abfrage

db.users.find({

username: req.body.user,

Passwort: req.body.pass

});

Defensiv-Muster: Whitelist und Cast-Eingaben

javascript

const userInput = {

Benutzer: String(req.body.user || ""),

pass: String(req.body.pass || "")

};

db.users.find({ username: userInput.user, password: userInput.pass });

Regex-Missbrauch in Abfragen

Angriffs-Nutzlast:

json

{ "Name": { "$regex": ".*" } }

Verteidigung (Disallow Regex):

javascript

if (!/^[A-Za-z0-9_]+$/.test(req.body.name)) {

throw new Error("Ungültige Zeichen");

}

Verhindern der JavaScript-Ausführung in MongoDB

Unsicher:

javascript

db.users.find({ $where: "this.age > 25" });

Sichere Konfiguration:

bash

# mongod.conf

Parameter setzen:

javascriptEnabled: false

Parametrisierte Abfragesimulation

Unsicher:

javascript

collection.find({ filter: JSON.parse(req.body.filter) });

Sicheres Parsing mit Sanitization Library

javascript

const sanitize = require('mongo-sanitize');

const filter = sanitize(req.body.filter);

collection.find(filter);

REST API Eingabefilterung

Verwundbar:

javascript

app.post("/search", (req, res) =>

db.collection("items").find(req.body).toArray()

);

Abgehärtet:

javascript

const allowedFields = ["Kategorie", "Preis"];

const Abfrage = {};

allowedFields.forEach(f => {

if (req.body[f]) query[f] = req.body[f];

});

db.collection("items").find(query).toArray();

Penetrante und automatisierte NoSQL-Sicherheitstests

In komplexen Anwendungen ist die manuelle Identifizierung jedes Injektionsvektors über APIs, dynamische Eingaben und Microservices hinweg oft unhaltbar. Sträflicheine KI-gesteuerte Plattform für Penetrationstests, unterstützt Sicherheitsteams durch:

  • Automatische Generierung und Einspeisung von manipulierten NoSQL-Nutzdaten, um nach Schwachstellen zu suchen
  • Korrelation von Abfragemustern mit risikoreichen Verhaltensweisen
  • Integration in CI/CD-Pipelines, um Regressionen frühzeitig zu erkennen
  • Erstellung von nach Prioritäten geordneten Berichten im Einklang mit OWASP- und CWE-Klassifizierungen

Dieser Ansatz ergänzt die traditionelle SAST/DAST durch kontextabhängige AnalyseDies ist besonders nützlich für dynamische NoSQL-Abfragesprachen, bei denen statische Regeln allein unzureichend sein können.

Schlussfolgerung: NoSQL ist nicht immun - sicheres Design

NoSQL-Datenbanken bieten Skalierbarkeit und Flexibilität, aber sie sind nicht immun gegen Injektionsrisiken, nur weil sie eine andere Syntax verwenden. Injektionsfehler in NoSQL-Datenbanken können die Authentifizierung umgehen, Daten offenlegen oder nicht autorisierte Operationen ermöglichen, wenn die Eingabe unsachgemäß behandelt wird. Durch die Kombination von strenger Eingabevalidierung, Schemaerzwingung, sicherer Treibernutzung und automatisierten Tests (einschließlich KI-gestützter Plattformen wie Penligent) können Ingenieure die Anfälligkeit für Nosql-Injection-Angriffe erheblich reduzieren.

Teilen Sie den Beitrag:
Verwandte Beiträge
de_DEGerman