Dienstag, 19. August 2008

News

präsentiert von: Entwickler Magazin
Donnerstag, 23. Juni 2005

About Security #11: SQL-Injection

Wie letzte Woche in "About Security (#10): Software-Audit -- Schwachstellensuche in Binaries" angekündigt, geht es ab dieser Woche um die Sicherheit von Webanwendungen, zunächst um das Einschleusen von SQL-Code in Datenbankabfragen – die SQL-Injection.

Was ist SQL-Injection?

Die Structured Query Language (SQL) ist eine Abfragesprache für relationale Datenbanken. Viele Webanwendungen verwenden zur Speicherung von Informationen eine solche Datenbank. Unabhängig davon, ob es sich um einen Webshop mit einer Artikeldatenbank, ein Forensystem mit Benutzerdaten oder um ein Content-Management-System mit Texten handelt, bieten diese meist eine oder mehrere Möglichkeiten für den Benutzer, um Daten aus der Datenbank abzufragen. Diese Abfragen werden intern in SQL formuliert. Dabei werden vorgegebene Teile mit den Benutzereingaben zu einer kompletten Abfrage kombiniert. Werden die vom Benutzer gelieferten Eingaben nicht ausreichend geprüft, kann ein Angreifer beliebige SQL-Befehle in die Abfragen einschleusen. Dieses Einschleusen von Code wird als SQL-Injection bezeichnet.

Einige Beispiele

Ein Forensystem speichert die Benutzerinformationen in der Tabelle Benutzer der Datenbank Forum. Die Tabelle hat die Spalten BenutzerNr, BenutzerName, RealName, Ort, Status und Passwort. Dabei soll Status die Werte normal für einfache Benutzer und admin für Benutzer mit Administrator-Rechten annehmen können.

Der SQL-Befehl

SELECT * FROM Benutzer WHERE Ort = 'Berlin'

gibt die Einträge aus der Tabelle Benutzer aus, die in der Spalte Ort den Wert Berlin aufweisen.

Um die Abfrage flexibler zu gestalten wird statt des konstanten Wertes meist eine Variable verwendet:

SELECT * FROM Benutzer WHERE Ort = '$ort'

Solange $ort nur Eingaben wie Berlin, Hamburg, ... enthält, passiert nichts Unerwünschtes. Ein bösartiger Benutzer könnte jedoch auch versuchen, SQL-Befehle einzuschleusen. Die Eingabe
Berlin'; DROP TABLE Benutzer --
würde zu folgendem SQL-Befehl führen:

SELECT * FROM Benutzer WHERE Ort = 'Berlin'; DROP TABLE Benutzer --'

Das Semikolon ist ein Trennzeichen, die Zeichenfolge -- leitet einen Kommentar ein. Damit werden folgende SQL-Befehle ausgeführt:

SELECT * FROM Benutzer WHERE Ort = 'Berlin'

gibt wie gehabt die Einträge aus der Tabelle Benutzer aus, die in der Spalte Ort den Wert Berlin aufweisen.

DROP TABLE Benutzer

löscht die Tabelle Benutzer, sofern die Webanwendung die notwendigen Rechte dazu hat.

--'

sorgt dafür, dass das letzte Quote-Zeichen ignoriert wird und keinen Fehler verursacht.

Beim Aufruf mit der Eingabe
Berlin'; UPDATE Benutzer SET Status = 'admin' WHERE BenutzerName = 'Angreifer
ergeben sich folgende Befehle:

SELECT * FROM Benutzer WHERE Ort = 'Berlin';
UPDATE Benutzer SET Status = 'admin' WHERE BenutzerName = 'Angreifer'

Damit kann sich der Angreifer Administrator-Rechte für das Forensystem verschaffen. Voraussetzung dafür ist, dass er Kenntnisse über die Datenbankstruktur besitzt. Bei Open-Source-Software kann er diese im Sourcecode nachlesen, bei Closed-Source-Software kann er selbst provozierte Fehlermeldungen ausnutzen, um sich die nötigen Informationen zu verschaffen.

Mit der Eingabe
' OR 1=1 --
erhält man

SELECT * FROM Benutzer WHERE Ort = '' OR 1=1 --'

Damit würde die gesamte Tabelle Benutzer ausgegeben.

Auch der direkte Aufruf von Systembefehlen ist möglich. Für den MS-SQL-Server unter Windows 2000 würde die Eingabe
' exec master..xp_cmdshell 'net user boese boese/ADD
zur Abfrage

SELECT * FROM Benutzer WHERE Ort = '' exec master..xp_cmdshell 'net user boese boese/ADD'

führen. Der MS-SQL-Server erkennt den hinteren Teil des Befehls als Extended Stored Procedure (ESP) und führt sie auf dem Server aus. Die Funktion xp_cmdshell übergibt ihren Parameter an die DOS-Kommandozeile. Diese legt auf dem System den Benutzer boese mit dem Passwort boese an. Darüber kann der Angreifer dann auf das System zugreifen.

Um Benutzername und Passwort beim Einloggen zu prüfen könnte folgende Abfrage mit den Benutzereingaben $benutzer und $pass verwendet werden:

SELECT COUNT(*) FROM Benutzer WHERE BenutzerName='$benutzer' AND Passwort='$pass'

Um sich als beliebiger Benutzer anzumelden, kann ein Angreifer irgendeinen Benutzernamen, im Beispiel bob, und das Passwort
' OR 1=1 --
eingeben. Dies ergibt

SELECT COUNT(*) FROM Benutzer WHERE BenutzerName='bob' AND Passwort='' OR 1=1 --'

Statt nach Benutzernamen und passendem Passwort sucht diese Abfrage nur nach dem Benutzernamen bob. Existiert dieser Benutzername, ist der Angreifer danach als bob angemeldet.

Dies ist nur eine kleine Auswahl möglicher Angriffe über SQL-Injection. Wie man sieht, kann eine kleine Nachlässigkeit bei der Prüfung von Benutzereingaben unter Umständen schwerwiegende Folgen haben. In der nächsten Woche ist das Thema daher die Verhinderung der SQL-Injection.

Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder als Kommentar an die Kolumne anfügen.

Carsten Eilers



Neuen Kommentar verfassen
Name:


Kommentar:


Bitte geben Sie die Buchstaben aus dem Bild als Bestätigung ein!


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! 2008

BASTA! 2008

22.-26. September 2008
Rheingoldhalle, Mainz

SQLCON 2008

SQLCON 2008

22.-26. September 2008
Rheingoldhalle, Mainz

IPC 2008

IPC 2008

27.-31. Oktober 2008
Rheingoldhalle, Mainz

AJAX IN ACTION 2008

AJAX IN ACTION 2008

28.-31. Oktober 2008
Rheingoldhalle, Mainz

EKON 12

EKON 12

28.-31. Oktober 2008
Congress Centrum, Mainz

W-JAX 2008

W-JAX 2008

3.- 7. November 2008
ArabellaSheraton Hotel München

SOACON 2008

SOACON 2008

3.- 7. November 2008
Arabella Sheraton Hotel, München

JAX Asia 2008

JAX Asia 2008

25.-28. November 2008
Singapore, Kuala Lumpur, Jakarta

Werbung
Top-Jobs

Software & Support Verlag GmbH

Volontär (w/m) Redaktion, Vollzeit

Hueber Verlag GmbH & Co. KG

Webdesigner/ Webprogrammierer (m/w)

Gebit Solutions

Java Profis gesucht (m/w)

OLYMPUS EUROPA Holding GmbH

Web-Entwickler (m/w)

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