Injection

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

Injection — Trainingsschritte

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. Die komplette Tabelle

    Der Filter, der die Suche auf veröffentlichte Produkte begrenzt hat, ist weg — die Antwort belegt es.

  9. 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.

  10. 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