Mittwoch, 8. Februar 2012

News

präsentiert von: entwickler.com
Donnerstag, 31. Juli 2008

About Security #166: Schwachstellensuche: SQL-Injection-Grundlagen

SQL-Injection-Schwachstellen sind eine weitere, weit verbreitete Art von Schwachstellen in Webanwendungen. Ab dieser Folge erfahren Sie, wie Sie diese in About Security #11 beschriebenen Schwachstellen in Ihrer Webanwendung finden können.

Vorbemerkungen

N E U ! Security aktuell
Täglich aktuelle Security-Infos!

Von SQL-Injection sind natürlich nur Webanwendungen betroffen, die Daten in einer SQL-Datenbank speichern. Außerdem müssen vom Benutzer manipulierbare Daten für SQL-Abfragen an die Datenbank verwendet werden. Manipulierbare Daten sind dabei nicht nur Eingabefelder, wie für eine Suche, sondern auch z.B. in versteckten Formularfeldern oder dem URL gespeicherte IDs zur Auswahl der nächsten Seite und Ähnliches. Zum Sammeln von Informationen über die Webanwendung gehört auch die Frage, ob ein Parameter für eine SQL-Abfrage verwendet wird. Bei der eigenen Webanwendung weiß man natürlich, welche Parameter in einer SQL-Abfrage verwendet werden und welche nicht. Ein Angreifer hat diesen Vorteil nicht. Er muss die betreffenden Parameter erst ermitteln. Zum einen kann man beim Sammeln von Informationen über die Webanwendung (wie ab About Security #144 beschrieben) für jeden Parameter überlegen, ob er vielleicht in einer Datenbank gespeichert werden könnte. Zum anderen liefern Reaktionen auf Manipulationen der Parameter einen Hinweis auf für SQL-Abfragen verwendete Parameter. Zum einen durch direkte Fehlermeldungen der SQL-Datenbank, zum anderen durch verräterische Informationen der Webanwendung selbst. Darauf werde ich später noch einmal zurückkommen.

Als Grundlage ein erstes Beispiel

Um SQL-Injection-Schwachstellen suchen zu können, muss man erst einmal wissen, wie SQL Injection überhaupt funktioniert. Als Beispiel soll der SQL-Befehl SELECT zur Auswahl von Daten dienen, der folgendes Format hat:

SELECT spalte1, spalte2 FROM datenbanktabelle WHERE bedingung

Als Beispiel für eine Webanwendung soll eine Onlinebuchhandlung dienen. Die Details zu den Büchern werden in einer SQL-Datenbank gespeichert, die nach den verschiedenen Feldern wie z.B. ISBN, Autor, Titel, Jahr und Verlag durchsucht werden kann. Für die Suche nach allen Büchern aus einem bestimmten Verlag wird dann folgende SQL-Abfrage aus der Eingabe gebildet:

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = ''

ist der Parameter der Webanwendung, in den der Benutzer den gesuchten Verlag eingibt. Der Parameter muss als String in '-Zeichen eingeschlossen werden. Bei der Suche nach allen Büchern des Verlags entwickler.press wird dann folgende SQL-Abfrage aus der Eingabe gebildet:

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'entwickler.press'

Die Abfrage führt dazu, dass jede Zeile der Datenbank daraufhin geprüft wird, ob in der Spalte "Verlag" der Wert entwickler.press steht. Alle gefundenen Zeilen werden zusammengefasst und an die Webanwendung zurückgegeben, die das Ergebnis aufbereitet und als HTML-Seite an den Benutzer liefert.

Sicher oder nicht?

Was passiert nun, wenn jemand nach Büchern von O'Reilly sucht? Die Anwendung bildet folgende SQL-Abfrage:

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'O'Reilly'

Der SQL-Interpreter verarbeitet diese Abfrage genau wie die davor: Er parst die Eingabe in den '' und erhält den Wert O. Danach stößt er auf den ihm unbekannten Ausdruck Reilly'. Damit hat die Abfrage keine korrekte SQL-Syntax, und eine Fehlermeldung wird ausgegeben:

Incorrect syntax near Reilly'.
Status [...]
Unclosed quotation mark before the character string '
About Security: Die komplette Serie

So eine Fehlermeldung bedeutet, dass die Anwendung für SQL-Injection anfällig ist: Ein Angreifer kann durch Eingabe eines ' den Wert für den manipulierten Parameter beenden und danach beliebigen SQL-Code anfügen, der dann auf dem Server ausgeführt wird. Das Standardbeispiel für diesen Fall ist eine Eingabe, die zur Ausgabe der gesamten Datenbank führt. Hier wäre das z.B. mit dem Wert

irgendwas' OR 1=1--

möglich. Der führt zur SQL-Abfrage

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'irgendwas' OR 1=1--'

Jede Zeile der Datenbank wird daraufhin geprüft, ob sie in der Spalte Verlag den Wert irgendetwas enthält oder ob 1=1 ist. Da 1 immer gleich 1 ist, wird jede Zeile ausgegeben. Die angehängten -- markieren einen Kommentar und sorgen dafür, dass das folgende '-Zeichen keinen Fehler verursacht. Manchmal muss die Anzahl der '-Zeichen ohne Kommentar-Zeichen ausgeglichen werden. Dann würde folgende Eingabe zum gleichen Ergebnis führen:

irgendwas' OR 'a' = 'a

ergibt als Abfrage

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'irgendwas' OR 'a' = 'a'

Dieses Beispiel ist relativ harmlos, der Angreifer könnte sich die gesamte Datenbank auch durch Eingabe eines Verlags nach dem anderen herunterladen. Es gibt aber auch weitaus gefährlichere Möglichkeiten, wie mit eingeschleusten SQL-Code Schaden angerichtet werden kann.

In der nächsten Folge lernen Sie weitere mögliche SQL-Injection-Angriffe kennen und erfahren, wie Sie gefährliche Parameter erkennen können.

Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!

Carsten Eilers

About Security – Übersicht zum aktuellen Thema "Schwachstellensuche – III. Angriffe über vom Benutzer gelieferte Daten: SQL Injection"

(rl)

Kommentare

Konferenzen

BASTA! 2012

BASTA! 2012

27.- 2. März 2012
Maritim Hotel Darmstadt

MobileTech Conference

MobileTech Conference

26.-28. März 2012
München

JAX 2012

JAX 2012

16.-20. April 2012
Rheingoldhalle, Mainz

BigData Con 2012

BigData Con 2012

16.-18. April 2012
Rheingoldhalle, Mainz

Business Technology Days

Business Technology Days

17.-19. April 2012
Rheingoldhalle, Mainz

International PHP Conference

International PHP Conference

3.- 6. Juni 2012
Maritim proArte, Berlin

webinale 2012

webinale 2012

4.- 6. Juni 2012
Maritim proArte Berlin

RailswayCon

RailswayCon

4.- 6. Juni 2012
Maritim proArte, Berlin

Werbung
Top-Jobs

Fraunhofer-Institut für Windenergie und Energiesystemtechnik IWES

Informatikerin / Informatiker

Magazine

Entwickler Magazin - Enterprise Technologies & Business Solutions

Entwickler Magazin

Enterprise Technologies & Business Solutions

dot.net magazin - die unabhängige Quelle für .NET-Technologien

dot.net magazin

Die Quelle für .NET-Technologien

Eclipse Magazin

Eclipse Magazin

Weltweit erstes Magazin für Eclipse-Entwickler

Java Magazin - Internet & Enterprise Technology

Java Magazin

Internet & Enterprise Technology

Sharepoint

Sharepoint Magazin

Sharepoint

CREATE OR DIE - Ein Leben für die Kreativität

CREATE OR DIE

Ein Leben für die Kreativität

Business Technology - Management Magazin

Business Technology

Management Magazin

PHP Magazin - Professional PHP Development

PHP Magazin

Professional PHP Development

PHP User - Praktische Referenz für Internetenthusiasten

PHP User

Praktische Referenz für Internetenthusiasten

Bücher




Webhosting mit Host Europe