Dienstag, 2. Dezember 2008

News

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

About Security #166: Schwachstellen-Suche: SQL-Injection Grundlagen

Die Suche nach Schwachstellen in Webanwendungen geht weiter. Ab dieser Folge erfahren Sie, wie Sie die in About Security #11 beschriebenen SQL-Injection-Schwachstellen in Ihrer Webanwendung finden können.

Vorbemerkungen

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

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

Um SQL-Injection-Schwachstellen suchen zu können, muss man erst mal 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 Online-Buchhandlung 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 = '$verlag'

$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

(rl)

Kommentare

Ihre Meinung ist uns wichtig!
Mobile Computing Heute & Morgen!
Nehmen Sie an unserer Umfrage zum Thema Mobile Computing in Deutschland teil und nutzen Sie die Chance eine Casio Exilim EX-Z1050-Digitalkamera zu gewinnen!

Konferenzen

BASTA! Spring 2009

BASTA! Spring 2009

23.-27. Februar 2009
Maritim Rhein-Main Hotel Wissenschaftsstadt 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

webinale 09

webinale 09

25.-27. Mai 2009
Berlin

Werbung
Top-Jobs

Software & Support Verlag GmbH

Lektor (m/w), Vollzeit

Software & Support Verlag GmbH

Redakteur (m/w), Vollzeit

Endress+Hauser GmbH+Co. KG

Entwickler Datenbanksysteme (m/w)

Signsoft GmbH

Java-Entwickler (m/w)

Software & Support Verlag GmbH

Volontär (w/m) Redaktion, Vollzeit
JAX 09

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

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