Moin!
Prepared Statements funktionieren naturgemäß nur mit Daten innerhalb von SQL-Anweisungen. Sollen allerdings die SQL-Anweisungen selbst dynamisch auf Basis von übergebenen URL-Parametern zusammengestellt werden, muss man sich anderer Mittel bedienen.
Soll beispielsweise bei folgender Abfrage eine Sortierung vorgenommen werden...
SELECT * FROM users
... bediene ich mich einer Liste von erlaubten Spalten und Sortierreihenfolgen, gegen die geprüft wird und aus denen anshcließend der Teil hinter dem ORDER BY
zusammengebaut wird. Bastelt jemand an den URL-Parametern herum, kann nichts passieren.
Nun bin ich auf den Ansatz gestoßen, das mit einem Regex – etwa [a-zA-Z_0-9.]+\s+[adescADESC]+
– abzufangen. Das sieht auf den ersten Blick sicher aus, gefällt mir aber vom Bauchgefühl her nicht, weil es einem möglichen Angreifer viel Spielraum lässt.
Bedenken bereitet mir vor allem, dass ein Angreifer invalides SQL erzeugen kann, auch wenn mir ad hoc nicht einfällt, was ein Angreifer mit etwas wie SELECT * FROM users ORDER BY spaltenname AAA
anrichten kann.
An konkreten, ausnutzbaren Szenarien mit gültiger Syntax fallen mir zwei Orakel ein:
- Ein Angreifer kann herausfinden, welche Spalten die Tabelle in der Datenbank hat. Sortierung nach einer nicht existenten Spalte führt zu einem Fehler bei der Abfrage, Ergebnisse kriegt man im Falle einer nicht existenten Spalte folglich nicht zu Gesicht.
- Ein Angreifer kann durch Sortieren Werte eingrenzen oder komplett erraten. Bleiben wir beim Beispiel mit der
users
-Tabelle und von dieser wird nur eine Auswahl an Spalten öffentlich angezeigt. Wenn ich als Angreifer frei die Sortierung bestimmen und mir einen Account anlegen kann, so kann ich durch das Sortieren herausfinden, welche E-Mail-Adresse ein anderer Nutzer hinterlegt hat, indem ich so lange meine E-Mail-Adresse (oder etwas Vergleichbares) anpasse und die Reihenfolge der Sortierung mit dem zu erratenden E-Mail-Adresse beobachte, bis ich den Wert erraten oder die Sortierung sich nicht mehr ändert.
Außerdem kann ein Angreifer vielleicht die Datenbank stressen, indem er schwer sortierbare Spalten sortiert – das ist purer ein Schuss ins Blaue, ich könnte mir nur vorstellen, dass es so etwas geben könnte, aber vielleicht regelt das schlicht der Index...
Gruß
Julius