Donnerstag, 30. August 2012


Topthema

Donnerstag, 31. Juli 2008 | Topthema

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

(Link zum Artikel: http://www.entwickler.de/entwicklerde/kolumnen/044455)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

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

Folgende Links könnten Sie auch interessieren