Montag, 16. Januar 2012


Topthema

Donnerstag, 23. Juni 2005 | Topthema

About Security #11: SQL Injection

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

Ab dieser Folge geht es in About Security um die Sicherheit von Webanwendungen. Zuerst erfahren Sie etwas �ber das Einschleusen von SQL-Code in Datenbankabfragen � die SQL Injection.

Was ist SQL Injection?

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

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 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 Administratorrechten 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 Werts meist eine Variable verwendet:

SELECT * FROM Benutzer WHERE Ort = ''

Solange 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'
About Security: Die komplette Serie

Damit kann sich der Angreifer Administratorrechte 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 und verwendet werden:

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

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 Sie sehen, kann eine kleine Nachl�ssigkeit bei der Pr�fung von Benutzereingaben unter Umst�nden schwerwiegende Folgen haben. In der n�chsten Folge erfahren Sie, wie Sie SQL Injection verhindern 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 "Sichere Webanwendungen"

Kommentare

Folgende Links könnten Sie auch interessieren

  • SSO frei Haus  [01.09.2006]
    [http://entwickler.de/zonen/portale/psecom,id,101,online,910,.html]
  • Postwendend  [06.11.2003]
    [http://entwickler.de/zonen/portale/psecom,id,101,online,456,.html]
  • Sicherheit f�r den Apachen  [08.12.2003]
    [http://entwickler.de/zonen/portale/psecom,id,101,online,473,.html]
  • Daten gekonnt verpackt  [21.06.2005]
    [http://entwickler.de/zonen/portale/psecom,id,101,online,219,.html]
  • Castor-Transport  [05.05.2004]
    [http://entwickler.de/zonen/portale/psecom,id,101,online,202,.html]