Injektion
Verwandeln Sie ein Suchfeld in einen Lesezugriff auf die gesamte Datenbank.
Was ist Injektion?
Nicht vertrauenswürdige Eingaben werden zu einer Abfrage verkettet, die ein Interpreter dann analysiert, sodass die Eingabe kein Wert mehr ist und Teil der Anweisung wird. Sie eskalieren einen Endpunkt für die Katalogsuche in drei Schritten: Ein einfaches Anführungszeichen löst einen reinen SQL-Fehler aus, der die Abfrage zurückgibt, eine immer wahre Bedingung entfernt den veröffentlichten Filter und UNION SELECT erreicht eine andere Tabelle für Konto-E-Mails, bcrypt-Hashes und Rollen. Der Fix ist ein gebundener Parameter, daher kompiliert die Datenbank die Anweisung zuerst. Durch die Rückgabe eines Roh-SQL-Fehlers erhält ein Angreifer auch die Karte.
Was Sie lernen in Injektion
- 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
Injektion — Trainingsschritte
-
Ein ganz normaler Käufer-Zugang
Wexlar betreibt einen Großhandelsmarktplatz und vergibt Käuferkonten per Selbstregistrierung an jeden, der sich anmeldet. Bob hat sich eines geholt — mit einer Wegwerf-Identität. Sein Zugang ist der eines einfachen Käufers: Katalog durchstöbern, Bestellungen aufgeben, keinerlei Sonderrechte. Er öffnet die Entwicklerkonsole, um zu sehen, was dieses Konto ist und was die API zu bieten hat.
-
Ein einziges Suchfeld
Bobs Konto hat keinerlei Sonderrechte, Admin-Funktionen sind für ihn also unerreichbar. Interessant ist für ihn genau eine Eingabe: die Katalogsuche. Sie nimmt alles entgegen, was er eintippt, und gleicht es als Namen gegen die Produktdatenbank ab.
-
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 und wählt dabei genau so viele Spalten aus, wie die Produktabfrage zurückgibt.
-
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