![]() |
|
URL dieser Newsmeldung:
02.10.2008
About Security #175: Schwachstellen-Suche: Blind SQL-InjectionBlind SQL-Injection, manchmal auch als semantikbasierte SQL-Injection
bezeichnet, funktioniert genau anders herum als normale SQL-Injection:
Während bei einem herkömmlichen SQL-Injection-Angriff die
Bedeutung der vorhandenen SQL-Abfrage geändert wird, bleibt sie bei
einer Blind SQL-Injection erhalten, lediglich ihr Inhalt wird
geändert. Wie das funktioniert und was ein Angreifer damit erreichen
kann, erfahren Sie in dieser Folge.
VoraussetzungenVoraussetzung für Blind SQL-Injection ist, das der Angreifer erkennen kann, ob die eingeschleuste Abfrage korrekt war oder nicht. Dafür reicht es aus, wenn bei einem Fehler eine Standard-Fehlerseite ausgegeben wird, weitergehende Informationen sind nicht notwendig. Wenn der Angreifer zwischen einer richtigen und einer falschen Eingabe unterscheiden kann, kann er der Webanwendung ja/nein- bzw. true/false-Fragen stellen und so z.B. erst die Namen der benutzerdefinierten Tabellen und danach deren Inhalte abfragen. Und das auch dann, wenn das Ergebnis des eingeschleusten SQL-Codes nicht in der Ausgabe erscheint, z.B. weil es ausgefiltert wird. Ein BeispielSecurity aktuell Für einen Blind SQL-Injection-Angriff werden SQL-Abfragen verwendet, die trotz unterschiedlichem Aufbau zu identischen Ergebnissen führen. Am einfachsten ist das anhand mathematischer Ausdrücke zu sehen. Als Beispiel soll ein Online-Katalog dienen, bei dem die einzelnen Produkte über eine ID ausgewählt werden:
Eine gültige Artikelnummer soll z.B. 12 sein:
liefert dementsprechend eine Artikelbeschreibung. 12 kann auch auf anderen Wegen dargestellt werden. Ist SQL-Injection möglich, ergeben folgende URL alle das gleiche Ergebnis wie die ursprüngliche URL:
Werden entsprechende Werte bei der Suche nach einer SQL-Injection-Schwachstelle eingegeben, muss in der Ausgabe nicht nach einer Fehlermeldung, sondern nach zwei Eingaben mit identischer Ausgabe gesucht werden. Schön - Und wie geht es weiter?
Es ist also möglich, eine bestimmte Katalogseite über
verschiedene URL aufzurufen, aber das ist für einen Angreifer ziemlich
uninteressant, der möchte ja zumindest für ihn eigentlich nicht
zugängliche Daten abrufen. Dafür ist ein bisschen mehr
nötig, als 12 durch Wir wissen, das SQL-Injection möglich ist, nur wird das Ergebnis nicht ausgegeben, sondern vorher ausgefiltert. Das einzige, was der Angreifer erkennen kann, ist der Erfolg oder Misserfolg der SQL-Abfrage: Entweder die entsprechende Artikelbeschreibung wird ausgegeben, oder es erscheint eine allgemeine Fehlermeldung wie z.B. "Diesen Artikel gibt es leider nicht". Wenn schon nur ja/nein-Antworten gegeben werden, sollte man es vielleicht mal mit einfachen ja/nein-Fragen probieren, bzw. mit true/false-Fragen:
Wenn für die
die Artikelbeschreibung und für
die Fehlermeldung ausgegeben wird, hilft das auf den ersten Blick auch
nicht viel weiter. Aber wer sagt denn, das da nur 1=1 angehängt werden
kann? Wie wäre es mit einer etwas komplizierteren Abfrage? Die vom
Benutzer definierten Datenbanktabellen werden in der Tabelle
liefert den Namen der ersten vom Benutzer definierten Tabelle,
liefert den ersten Buchstaben davon und
dessen ASCII-Wert (siehe auch About Security #174). Liefert
die Artikelbeschreibung, ist der erste Buchstabe des Namens der ersten vom Benutzer definierten Tabelle ein A, gibt es eine Fehlermeldung, ist es ein anderer Buchstabe. Je nach Ergebnis probiert man das nun mit einem B oder mit dem zweiten Buchstaben. So können nach und nach alle Tabellennamen ermittelt werden, danach die Spaltennamen und dann die darin gespeicherten Daten. Das ist zwar eine sehr mühsame Arbeit - aber wozu gibt es denn Computer? Ein Programm, das 'Blind SQL-Injection'-Schwachstellen ausnutzen kann, um Schema und Inhalt einer betroffenen Datenbank zu ermitteln, ist z.B. Absinthe. Ein weiteres BeispielBetrachten wir noch einmal das Beispiel zur Authentifizierung aus About Security #167:
Das Ergebnis dieser SQL-Abfrage wird nicht ausgegeben, aber je nach Eingaben reagiert die Anwendung unterschiedlich: Bei Eingabe von
als Benutzername wird der Angreifer als Administrator angemeldet, bei der Eingabe von
schlägt die Anmeldung fehlt, da Genau wie beim obigen Beispiel können nun über true/false-Fragen Tabellen- und Spaltennamen sowie die Inhalte der Tabelle ausgespäht werden. In der nächsten Folge werden mögliche Gegenmaßnahmen gegen SQL-Injection-Angriffe beschrieben. Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen! About Security - Übersicht zum aktuellen Thema:
|
||
|