Wie der Angriff funktioniert

Der Kern jeder Injection ist die fehlende Trennung von Code und Daten. Eine Anwendung baut dynamische Abfragen oder Befehle per String-Verkettung mit Benutzereingaben zusammen.

Der Interpreter (SQL-Datenbank, NoSQL-Engine, Shell) kann dann nicht mehr unterscheiden, was ursprünglich gemeintes Kommando und was eingeschleuste Eingabe ist.

  • SQL: Eine WHERE-Klausel wird per Konkatenation gebildet, der Angreifer schmuggelt mit Zeichen wie ', -- oder OR 1=1 zusätzliche SQL-Logik ein.
  • NoSQL/MongoDB: Statt eines Strings sendet der Angreifer in einem JSON-Body ein verschachteltes Objekt mit Query-Operatoren, etwa {"$ne":"invalid"} oder {"$in":[...]}, die die Abfragelogik umbiegen; manche Engines erlauben über $where sogar JavaScript-Ausführung.
  • OS-Command: Benutzereingabe gelangt in einen an die Shell übergebenen Befehl; Metazeichen wie &, |, ; oder ` verketten zusätzliche Befehle (PortSwigger nennt & && | || als systemübergreifende Befehlstrenner).

Laut OWASP gilt durchgehend: Erst eine parametrisierte/sichere API trennt Code und Daten zuverlässig. Prepared Statements binden alle SQL-Teile vorab und behandeln Eingaben rein als Werte.

1. AusgangslageUngeprüfte Eingabe im Request oder JSON
→
2. AngriffWird in SQL, NoSQL oder einen Befehl eingeschleust
→
3. ErgebnisDaten ausgelesen oder Befehl ausgeführt

Ungeprüfte Eingaben landen ungetrennt in Abfragen oder Befehlen.

Beispiel

NoSQL-Operator-Injection zur Authentifizierungs-Umgehung über einen JSON-Login (PortSwigger).

  1. Erwartete Anfrage an eine Login-API: POST mit Content-Type: application/json und Body {"username":"wiener","password":"peter"} . Die App baut daraus eine MongoDB-Abfrage, die Benutzername und Passwort vergleicht.
  2. Angriff - der Client ersetzt die String-Werte durch verschachtelte Operator-Objekte: {"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}} .
  3. Wirkung laut PortSwigger: Werden beide Eingaben als Operator verarbeitet, liefert die Abfrage alle Datensätze, bei denen Benutzername und Passwort ungleich "invalid" sind - der Angreifer wird ohne gültiges Passwort als erster Nutzer der Collection eingeloggt.
  4. Gezielt auf ein bekanntes/erratenes Konto lässt sich laut PortSwigger ein Payload bauen wie: {"username":{"$in":["admin","administrator","superadmin"]},"password":{"$ne":""}} .

Quelle: PortSwigger.

Auswirkung

Unbefugter Zugriff auf sensible Daten (Passwörter, Kreditkartendaten, personenbezogene Daten), Veränderung oder Löschung von Daten sowie Umgehung von Authentifizierung und Zugriffskontrollen.

SQL-Injection war laut PortSwigger Ursache vieler hochkarätiger Datenpannen mit Reputationsschaden und regulatorischen Strafen, teils mit dauerhaftem Backdoor-Zugang.

NoSQL-Injection kann laut PortSwigger zusätzlich Authentifizierung umgehen, Daten extrahieren/ändern, Denial of Service verursachen und Code auf dem Server ausführen.

OS-Command-Injection führt typischerweise zur vollständigen Kompromittierung von Anwendung und Daten und erlaubt das Weiterspringen (Pivoting) auf andere Systeme der Infrastruktur.

So schützt man sich

  • Sichere/parametrisierte APIs verwenden (OWASP-Hauptverteidigung): bei SQL Prepared Statements mit Variablen-Binding bzw. parametrisierte Abfragen; analog ORM-/HQL-Named-Parameter - dadurch trennt die Datenbank Code und Daten unabhängig von der Eingabe.
  • OS-Befehle möglichst gar nicht direkt aufrufen - stattdessen Bibliotheksfunktionen nutzen (z.B. mkdir() statt system("mkdir ...")); lässt sich der Aufruf nicht vermeiden, Parametrisierung (z.B. Javas ProcessBuilder mit getrennten Argumenten, kein Shell-Aufruf) plus Eingabevalidierung kombinieren.
  • Positive/Allowlist-Eingabevalidierung als zusätzliche Schicht (nicht als alleinige Verteidigung): Befehle gegen eine erlaubte Liste prüfen, Argumente per strikter Allowlist-Regex inkl. Längenbegrenzung und ohne Metazeichen (& | ; $ > < ` \ ! ' " ( )) und ohne Whitespace.
  • Bei NoSQL/JSON-APIs erwartete Datentypen erzwingen: Werte als String validieren und verschachtelte Operator-Objekte ablehnen, damit keine $ne/$in/$where-Operatoren in die Abfrage gelangen.
  • Falls keine parametrisierte API verfügbar ist, Eingaben kontextspezifisch mit der korrekten Escape-Syntax des jeweiligen Interpreters maskieren (von OWASP nur als letzte Option, für SQL ausdrücklich als STRONGLY DISCOURAGED eingestuft).
  • Least Privilege umsetzen: Datenbank- und Prozessrechte minimal halten, isolierte Konten mit begrenzten Rechten pro Aufgabe, um den Schaden im Falle einer Ausnutzung zu begrenzen.

Quellen

Weiterlesen