Injection
Machen Sie aus einem Suchfeld einen Lesezugriff auf die gesamte Datenbank.
Was ist Injection?
Nicht vertrauenswürdige Eingaben werden mit einer Abfrage verkettet, die ein Interpreter anschließend verarbeitet. Dadurch wird aus einem Datenwert ein Teil der Anweisung. Sie nutzen einen Endpunkt für die Katalogsuche in drei Schritten aus: Ein einzelnes Anführungszeichen löst einen unveränderten SQL-Fehler aus, der die Abfrage offenlegt. Eine immer wahre Bedingung umgeht den Filter für veröffentlichte Produkte. Mit UNION SELECT greifen Sie auf eine andere Tabelle mit E-Mail-Adressen, bcrypt-Hashes und Rollen zu. Die Lösung ist ein gebundener Parameter, damit die Datenbank die Anweisung zuerst vorbereitet. Auch die Ausgabe unveränderter SQL-Fehler hilft Angreifern.
Was Sie lernen in Injection
- SQL-Injection erkennen: ein Parameter der Anfrage, der in eine Abfrage verkettet wird, die die Datenbank anschließend parst — die Eingabe kann die Abfrage umschreiben und an Daten herankommen, die der Endpunkt nie zurückgeben sollte
- Die Eskalation nachvollziehen: vom Test mit einem einfachen Anführungszeichen, der eine SQL-Fehlermeldung preisgibt, über eine immer wahre Bedingung, die einen Filter aushebelt, bis zu einem UNION SELECT, das eine völlig andere Tabelle abgreift
- Verstehen, dass Injection weder gestohlene Zugangsdaten noch fehlende Authentifizierung voraussetzt: Auch ein gewöhnliches, vollständig angemeldetes Konto kann über jede Eingabe einschleusen, die der Server als Code behandelt
- Die Gegenmaßnahme anwenden: parametrisierte Abfragen oder Prepared Statements einsetzen, damit der Wert separat gebunden und als Daten behandelt wird — statt auf handgeschriebenes Escaping oder Denylists gefährlicher Zeichen zu setzen
- Rohe SQL-Fehlermeldungen nicht an Clients preisgeben und jeden Endpunkt, der eine Abfrage, einen Befehl oder ein Template aus Eingaben zusammenbaut, auf dasselbe Verkettungsmuster prüfen
Injection — Trainingsschritte
-
Ein gewöhnliches Käuferkonto
Wexlar betreibt einen Großhandelsmarktplatz. Jeder, der sich registriert, kann dort selbst ein Käuferkonto anlegen. Bob richtet sich unter einer nur dafür angelegten Identität ein solches Konto ein. Mit seinem einfachen Käuferkonto kann er den Katalog durchsuchen und Bestellungen aufgeben, hat aber keine Sonderrechte. Er öffnet die Entwicklerkonsole, um sein Konto und die verfügbaren API-Funktionen zu erkunden.
-
Ein einziges Suchfeld
Bobs Konto hat keine Sonderrechte, daher kann er keine Admin-Funktionen nutzen. Sein Interesse gilt einem einzigen Eingabefeld: der Katalogsuche. Sie nimmt seinen Suchbegriff entgegen und sucht damit nach Namen in der Produktdatenbank.
-
Eine ganz normale Suche
Bob beginnt mit einer gewöhnlichen Suche, um den Endpunkt in Aktion zu sehen und seinen Aufbau zu verstehen. Die Suche nimmt den Query-Parameter q entgegen und liefert die Produkte zurück, deren Name dazu passt.
-
Alles wie vorgesehen
Die Suche verhält sich genau wie erwartet: drei veröffentlichte Laptops, und nur die Felder, die ein Käufer sehen soll.
-
Ein einfaches Anführungszeichen anhängen
Der älteste Injection-Test überhaupt: Bob hängt seinem Suchbegriff ein einfaches Anführungszeichen an. Wird der Begriff als Wert gesucht, liefert die Suche nach einem Namen mit Anführungszeichen darin schlicht kein Ergebnis. Wird er dagegen in SQL hineinverkettet, zerlegt das überzählige Anführungszeichen die Abfrage.
-
Die aufgebrochene Abfrage
Ein einziges zusätzliches Zeichen hat den Endpunkt abstürzen lassen — und die Fehlermeldung liefert Bob genau die Bestätigung, auf die er aus war.
-
Den Filter umschreiben
Jetzt, wo Bob weiß, dass sein Begriff Teil der Abfrage wird, zerlegt er sie nicht mehr, sondern steuert sie. Er baut einen Begriff, der die Zeichenkette schließt, eine immer wahre Bedingung ergänzt und den Rest der ursprünglichen Abfrage auskommentiert.
-
Die komplette Tabelle
Der Filter, der die Suche auf veröffentlichte Produkte begrenzt hat, ist weg — die Antwort belegt es.
-
An eine andere Tabelle herankommen
Alle Produkte zu lesen ist schlimm; Tabellen zu lesen, die die Suche nie anfassen sollte, ist schlimmer. Bob hängt mit einem UNION Zeilen aus einer anderen Tabelle an das Ergebnis an. Postgres akzeptiert ein UNION nur, wenn dessen Spalten nach Anzahl und Typ zur Produktabfrage passen. Deshalb packt er E-Mail-Adresse, Passwort-Hash und Rolle jedes Kontos in die Textspalte name und füllt die beiden Zahlenspalten mit 0 . Das vorangestellte AND false leert die Produkthälfte, sodass nur die gestohlenen Zeilen zurückkommen.
-
Der Zugangsdaten-Speicher im Suchergebnis
Die Zeilen, die zurückkommen, sind überhaupt keine Produkte.
Abdeckung der Sicherheits-Frameworks
OWASP API Top 10
- API8:2019 Injection
CWE
- CWE-74 Improper Neutralization of Special Elements in Output ('Injection')
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security