Donnerstag, 7. Juni 2012


Topthema

Donnerstag, 4. September 2008 | Topthema

About Security #171: Schwachstellen-Suche: SQL-Injection mit UNION (2)

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

Die Verwendung des in About Security #170 vorgestellten UNION-Operators ist an zwei Voraussetzungen gekn�pft. Welche das sind und wie ein Angreifer erreichen kann, dass sie erf�llt sind, erfahren Sie in dieser Folge.

Voraussetzungen

Bei der Verwendung des UNION-Operators m�ssen zwei Voraussetzungen erf�llt sein:

  1. Um �berhaupt mit einer weiteren Abfrage auf Daten zugreifen zu k�nnen, muss der Angreifer die Namen der Datenbanktabelle und ihrer Spalten kennen. Die verraten ihm die Fehlermeldungen der Datenbank oder ein Angriff auf die Systemtabellen, in denen diese Informationen gespeichert sind (siehe unten).
  2. Die Ergebnisse alle Abfragen m�ssen die gleiche Struktur, d.h. die gleiche Anzahl Spalten mit den gleichen oder kompatiblen Datentypen in der gleichen Reihenfolge, haben.
Struktur der Abfrage ermitteln

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

Die Struktur der Abfrage erf�hrt er oft durch die Fehlermeldungen der Datenbank: Immer, wenn ein Angriffsversuch fehl schl�gt, sagt die ihm, woran er gescheitert ist. Aber auch wenn die Datenbank-Fehlermeldungen von der Webanwendung abgefangen werden, ist er nicht hilflos. Zum einen kann er erkennen, ob ein Angriff erfolgreich war: Die zus�tzlichen Informationen erscheinen automatisch in der Ausgabe. Zum anderen gibt es zwei Punkte, die ihm den Angriff erleichtern:

  • Die Datentypen in den verkn�pften Abfragen m�ssen nicht identisch, sondern nur kompatibel, d.h. in den richtigen Datentyp umwandelbar sein. Wie bereits zu sehen war, werden Zahlen bei Bedarf automatisch in Strings umgewandelt. Au�erdem kann der Wert NULL in jeden beliebigen Datentyp umgewandelt werden. Ist der Datentyp einer Spalte nicht bekannt, kann daf�r in der SELECT-Anweisung immer NULL eingegeben werden, ohne zu einem Fehler zu f�hren.
  • Meist reicht es, in der originalen Abfrage ein Feld mit Datentyp String zu identifizieren. Danach k�nnen beliebige SQL-Abfragen eingeschleust werden, die eine einzelne Spalte mit String-Werten zur�ckgeben. Der Angreifer kann dann systematisch eine Spalte nach der anderen lesen, er ist nicht darauf angewiesen, alle Spalten auf einmal abzufragen.
Spaltenanzahl ermitteln

Um die Anzahl der zur�ckgelieferten Spalten zu ermitteln, kann der Angreifer ausnutzen, dass NULL in jeden beliebigen Datentyp umgewandelt werden kann. Er gibt so lange Abfragen mit unterschiedlicher Spaltenanzahl ein, bis die Abfrage ausgef�hrt wird:

nix' UNION SELECT NULL--
nix' UNION SELECT NULL, NULL--
nix' UNION SELECT NULL, NULL, NULL--
...

Auch wenn keine Datenbank-Fehlermeldungen ausgegeben werden, erkennt er, wenn die Abfrage erfolgreich ausgef�hrt wurde: Das Ergebnis enth�lt eine zus�tzliche Zeile, in der das Wort NULL oder ein leerer String steht. Die zuletzt eingegebene Abfrage enthielt dann die korrekte Spaltenzahl.

Alternativ kann eine 'ORDER BY'-Klausel in die originale Abfrage eingeschleust und der Index der Spalte solange erh�ht werden, bis es einen Fehler ergibt:

nix' ORDER BY 1--
nix' ORDER BY 2--
nix' ORDER BY 3--
...

Durch den eingeschleusten Code �ndert sich in den ersten F�llen nur die Reihenfolge der Zeilen im Ergebnis. Kommt es zu einem Fehler, wurde eine ung�ltige Spaltennummer angegeben, die tats�chliche Anzahl an Spalten ist also um 1 geringer.

Spalte mit Datentyp String suchen

Wurde die korrekte Anzahl der Spalten ermittelt, sucht der Angreifer nach einer Spalte, deren Datentyp String ist. Daf�r wird wieder eine Reihe von Abfragen nach NULL verwendet, nur dass diesmal der Reihe nach f�r eine Spalte ein String eingegeben wird. F�r eine Abfrage mit drei Spalten ergibt das folgende Abfragen:

nix' UNION SELECT 'geschafft', NULL, NULL--
nix' UNION SELECT NULL, 'geschafft', NULL--
nix' UNION SELECT NULL, NULL, 'geschafft'--
About Security: Die komplette Serie

Wird die Anfrage ausgef�hrt, erscheint in der Ausgabe eine zus�tzliche Zeile mit dem Wert 'geschafft' darin. �ber die so ermittelte Spalte k�nnen dann die Daten aus der Datenbank gelesen werden. Um zu testen, ob ein Angriff wirklich funktioniert, kann z.B. die Version der Datenbank abgefragt werden. Hat die Abfrage drei Spalten, von denen die zweite Strings enth�lt, gibt folgende SQL-Injection unter MySQL und MS-SQL die Datenbankversion aus:

nix' UNION SELECT NULL, @@version, NULL--

Nachdem die Datenbankversion bekannt ist, kann nach bekannten Schwachstellen darin gesucht werden. Meist macht der Angreifer aber mit dem Lesen von Informationen aus der Datenbank weiter.

Datenbanksystem ermitteln

Die verschiedenen Datenbanksysteme verwenden alle etwas unterschiedliche SQL-Dialekte, sodass der Angreifer f�r manche Angriffe erst einmal wissen muss, mit welchem System er es denn zu tun hat. Eine einfache Methode, um die verschiedene Datenbanken zu unterscheiden, ist deren Art, Strings miteinander zu verbinden:

Oracle: 'ver'¦¦'binden'
MS-SQL: 'ver'+'binden'
MySQL:  'ver' 'binden' (zwischen beiden Teilen befindet sich ein Leerzeichen)

Die Version, die zum richtigen Ergebnis f�hrt, identifiziert dann die Datenbank. Danach kann der Angreifer dann datenbankspezifische Anweisungen nutzen oder deren Systemtabellen ausspionieren. Darin sind z.B. auch die vom Benutzer definierten Tabellen und Spalten gespeichert - eine Information, die der Angreifer f�r den Zugriff auf diese Tabellen ben�tigt.

Um SQL-Injection zu verhindern, werden die Benutzereingaben gepr�ft und gefiltert. Welche M�glichkeiten es daf�r gibt und wie ein Angreifer die Filter eventuell austricksen 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