Mittwoch, 7. Januar 2009

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

dot.net Code Camp C# 3.5

Konferenzen

BASTA! Spring 2009

BASTA! Spring 2009

23.-27. Februar 2009
Maritim Rhein-Main Hotel Wissenschaftsstadt Darmstadt

Entwicklertage 2009

Entwicklertage 2009

23.-27. Februar 2009
Darmstadt

BASTA! Italia 2009

BASTA! Italia 2009

16.-18. März 2009
Holiday Inn EUR Parco dei Medici, Roma

PHPCon Italia 2009

PHPCon Italia 2009

18.-20. März 2009
Holiday Inn EUR Parco dei Medici, Roma

JAX 09

JAX 09

20.-24. April 2009
Rheingoldhalle Mainz

Eclipse Forum Europe 09

Eclipse Forum Europe 09

20.-24. April 2009
Rheingoldhalle Mainz

webinale 09

webinale 09

25.-27. Mai 2009
Berlin

RailsWayCon

RailsWayCon

25.-27. Mai 2009
Berliner Congress Center, Alexanderplatz, Berlin

Werbung
Top-Jobs

Endress+Hauser GmbH+Co. KG

Entwickler Datenbanksysteme (m/w)

Software & Support Verlag GmbH

Redakteur (m/w), Vollzeit

Software & Support Verlag GmbH

Volontär (w/m) Redaktion, Vollzeit

Software & Support Verlag GmbH

Lektor (m/w), Vollzeit

Signsoft GmbH

Java-Entwickler (m/w)
Entwickler Tage

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

Ruby on Rails

RailsWay Magazin

Ruby on Rails

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

Bücher


hosted by HostEurope