Donnerstag, 7. Juni 2012


Topthema

Donnerstag, 28. August 2008 | Topthema

About Security #170: Schwachstellen-Suche: SQL-Injection mit UNION

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

Wie ein Angreifer SQL-Injection im zum L�schen von Daten verwendeten DELETE-Statement ausnutzen kann und welche M�glichkeiten der zur Verkn�pfung der Ergebnisse mehrerer SELECT-Abfragen verwendete UNION-Operator ihm bietet, erfahren Sie in dieser Folge.

Weg damit: DELETE

DELETE-Statements dienen zum L�schen einer oder mehrerer existierender Zeilen in einer Tabelle. Wie bei UPDATE-Statements wird die zu l�schende Zeile �ber eine WHERE-Klausel ausgew�hlt, in der sehr wahrscheinlich auch die vom Angreifer manipulierbaren Parameter verwendet werden. Wie beim UPDATE-Statement k�nnen �nderungen an der WHERE-Bedingung weitreichende Folgen haben.

DELETE FROM benutzer WHERE name='jo' AND passwort='geheim'

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

l�scht die Informationen des Benutzers jo, wenn er das richtige Passwort eingegeben hat. Wie schon beim Beispiel zum UPDATE-Statement in About Security #169 soll SQL-Injection wieder �ber den Parameter f�r den Benutzernamen m�glich sein. Der einfachste Angriff ist ein Denial-of-Service-Angriff durch L�schen aller Daten, dazu reicht die Eingabe eines Wertes wie z.B.

egal' OR 1=1--

aus:

DELETE FROM benutzer WHERE name='egal' OR 1=1--' AND passwort='was'

l�scht alle Zeilen der Tabelle benutzer. Wie schon beim UPDATE-Statement festgestellt, kann ein unvorsichtiger Test �u�erst unangenehme Folgen haben. Als Fortsetzung des letzten Beispiels in About Security #169 k�nnte die Webanwendung nach einem erfolgreichen Login den Parameter f�r den Benutzernamen verwenden, um in einer Tabelle mit Protokollinformationen alte Eintr�ge zu l�schen:

DELETE FROM verlauf WHERE name='jo' ORDER BY timestamp DESC LIMIT 10;

Wurde die Passwortabfrage durch Eingabe von

' OR 1=1--

umgangen, ergibt das

DELETE FROM verlauf WHERE name='' OR 1=1--' ORDER BY timestamp DESC LIMIT 10;

und l�scht die gesamte Verlaufstabelle. Einen Angreifer freut das vielleicht sogar, da dabei auch eventuell vorhandene verr�terische Spuren gel�scht werden, auf jeden Fall wird es ihn nicht weiter st�ren. F�r den Betreiber der Webanwendung kann das je nach Verwendung der Daten aber ziemlich �rgerlich sein. Darum f�hrt man solche Experimente auch besser an einem Testsystem durch.

Nachdem die am h�ufigsten verwendeten SQL-Statements vorgestellt wurden, kommt nun der f�r SQL-Injection-Angriffe wichtigste Operator: UNION.

Zusammenf�gen, was (nicht) zusammen geh�rt: UNION
About Security: Die komplette Serie

Der UNION-Operator wird zur Verkn�pfung der Ergebnisse von zwei oder mehr SELECT-Statements zu einem einzigen Ergebnis verwendet. Ist SQL-Injection in ein SELECT-Statement m�glich, kann oft eine zweite, von der vorhandenen Abfrage vollkommen unabh�ngige Abfrage durchgef�hrt und das Ergebnis �ber den UNION-Operator mit dem vorhandenen Ergebnis verkn�pft werden. Wird das Ergebnis an den Benutzer zur�ckgeliefert, kann ein Angreifer so beliebige Daten aus der Datenbank abfragen. Als Beispiel soll wieder die B�cher-Datenbank aus About Security #166 dienen:

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'entwickler.press'

Die k�nnte z.B. folgendes Ergebnis als Teil der Ergebnis-Webseite liefern:

Autor Titel Jahr
Carus Ethical Hacking 2008
Eilers Ajax Security 2008
Wussow Sichere Webanwendungen 2007

Wie �ber SQL-Injection in dieser Abfrage die gesamte B�cher-Datenbank ausgelesen werden kann, wurde bereits in About Security #166 beschrieben. F�r den Angreifer viel interessanter w�re es aber, z.B. die Benutzertabelle zu lesen. Das ist �ber eine weitere SELECT-Anweisung und den UNION-Operator m�glich:

entwickler.press' UNION SELECT benutzername, passwort, id FROM benutzer--

als Eingabe f�hrt zu folgender SQL-Abfrage:

SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'entwickler.press'
UNION
SELECT benutzername, passwort, id FROM benutzer--'

Diese Abfrage liefert das bereits bekannte Ergebnis, gefolgt vom Inhalt der Benutzertabelle:

Autor Titel Jahr
Carus Ethical Hacking 2008
Eilers Ajax Security 2008
Wussow Sichere Webanwendungen 2007
admin 12geheim34 0
alice abc123 1

Werden die Ergebnisse von SELECT-Abfragen mit dem UNION-Operator miteinander verkn�pft, erh�lt das Gesamtergebnis die gleichen Spaltennamen wie die der ersten SELECT-Abfrage. Das ist f�r einen SQL-Injection-Angriff auch zwingend notwendig, da die Webanwendung nat�rlich nur die ihr bekannten Spalten ausgibt. Wird eine Zeile des Ergebnis z.B. im Array zeile[] gespeichert, werden die einzelnen Spalten f�r die Ausgabe �ber zeile['Autor'], zeile['Titel'] und zeile['Jahr'] angesprochen. Da die Webanwendung die Spaltennamen benutzername, passwort und id nicht kennt, w�rde sie sie im Gesamtergebnis der verkn�pften SQL-Abfragen ignorieren. Da darin aber alle Spalten die Namen der ersten SELECT-Abfrage erhalten, gibt die Webanwendung alle Zeilen des Gesamtergebnis aus, ohne zu erkennen, dass sich darunter Daten aus einer anderen Tabelle befinden.

Welche Voraussetzungen f�r die Verwendung des UNION-Operators bestehen und wie ein Angreifer die erreichen kann, erfahren Sie in der n�chsten Folge.

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:

Kommentare

Folgende Links könnten Sie auch interessieren