UNION Based SQL Injection

UNION based SQL Injections können genutzt werden um Informationen aus einer Datenbank auszulesen.

Um den Operator „UNION“ in einer SQL Injection benutzen zu können ist es nötig, dass der Angreifer die exakt gleiche Anfragestruktur in einer „SELECT“ Abfrage baut wie eine Originalanfrage sie hätte. Daher sind folgende Voraussetzungen nötig:

  • Richtiger table name muss bekannt sein
  • Anzahl der Spalten (columns) muss bekannt sein und deren Datentyp

Die oben genannten benötigten Angaben kann der Angreifer recht einfach von der Datenbank abfragen, wenn die Fehlermeldungen angeschaltet sind.

Table Name

Ein table name kann entweder durch Zufall erraten werden oder man erarbeitet sich die Informationen über die „system tables“. Die Anzahl der häufiger benutzten Datenbankmanagementsysteme (DBMS) ist sehr gering und daher ist es möglich recht schnell auf einen richtigen system table name zu stoßen und damit das DBMS zu verifizieren. Die benötigte Fehlermeldung hierbei ist „query block has incorrect number of result columns“, dies bedeutet der table name ist korrekt, aber die Spaltenanzahl ist noch korrekt.

Spaltenanzahl

Die Spaltenanzahl kann mit einem „ORDER BY“ in einem SELECT statement herausgefiltert werden. Dies funktioniert in dem man die Spalten immer wieder neu sortieren lässt und die Anzahl der Spalten so lange erhöht bis die Fehlermeldung zurückgegeben wird, dass das ORDER-BY item zu der Anzahl der enthaltenen SELECT items gehören muss. Damit ist die Anzahl der Spalten jene, die in der vorletzten Anfrage genutzt wurde.

Datentyp

Um den Datentyp jeder einzelnen Spalte zu ermitteln ist es wichtig zu wissen, dass grundsätzlich die Datentypen in zwei Kategorien aufgeteilt werden können:

  • Nummerischer Datentyp
  • „Strings“ (durch Hochkommata eingeschlossen)

Die Ermittlung kann manuell oder tool gestützt erfolgen.

Sind Fehlermeldungen nicht angeschaltet, ist UNION-based SQL Injection trotzdem möglich. Es erfordert nur eine andere Technik (Blind SQL Injection).

Sobald der Angreifer alle drei Informationen ermittelt hat, kann dieser die entsprechenden Inhalte der tables auslesen.

Beispiel einer MySQL Injection:

X'UNION SELECT Vorname,Name,Fachgebiet,Raum FROM Hochschule.Lehrkörper;


Quelle: https://www.sqlinjection.net/union/