SQL-Injection

0 | 28402 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "SQL-Injection" mit Ihrem Wissen!

Anzeige Hier werben

Verwandte Angriffe:

Kurze Beschreibung:

SQL-Injection (dt. SQL-Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL-Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht. Der Angreifer versucht dabei, über die Anwendung, die den Zugriff auf die Datenbank bereitstellt, eigene Datenbankbefehle einzuschleusen.

Folgen:

Dem Angreifer ist es mit einem erfolgreichen Angriff möglich, Daten auszuspähen, in seinem Sinne zu verändern oder ganz zu löschen, sowie die Kontrolle über den Server zu erhalten.

Funktionsweise:

SQL-Injections sind dann möglich, wenn Daten wie beispielsweise Benutzereingaben in den SQL-Interpreter gelangen. Denn Benutzereingaben können Zeichen enthalten, die für den SQL-Interpreter Sonderfunktionen besitzen und so Einfluss von außen auf die ausgeführte Datenbankbefehle ermöglichen. Solche Metazeichen in SQL sind zum Beispiel \ „ ' und ;

Oft sind solche Lücken in CGI-Skripten und in Programmen zu finden, die Daten wie Webseiteninhalte oder E-Mails in SQL-Datenbanken eintragen. Nimmt ein solches Programm die Maskierung nicht korrekt vor, kann ein Angreifer durch den gezielten Einsatz von Funktionszeichen weitere SQL-Befehle einschleusen oder die Abfragen so manipulieren, dass zusätzliche Daten verändert oder ausgegeben werden. In einigen Fällen besteht auch die Möglichkeit, Zugriff auf eine Shell zu erhalten, was im Regelfall die Möglichkeit zur Kompromittierung des gesamten Servers bedeutet.

Beispiel:

Wenn Benutzereingaben nicht oder nur mangelnd Maskiert werden, können durch den Endbenutzer der Anwendung die Abfragen an die Datenbank manipuliert werden:

 
sql
1
Statement = "SELECT * FROM users WHERE name = '" + userName + "';"

Diese Abfrage ist so konzipiert, das die Datensätze des angegebenen Benutzernamen ausgelesen werden. Wenn jedoch die Variable userName in eine bestimmte Weise abgeändert wird, kann die SQL Anweisung wesentlich mehr Schaden anrichten. Wird für die Variable userName beispielsweise ' or '1'='1 eingesetzt, oder ' or '1'='1';-- mit Kommentaren den Rest der Abfrage geblockt, ergibt sich daraus folgendes SQL Statement

 
sql
1
SELECT * FROM users WHERE name = '' OR '1'='1';-- Rest der Abfrage

Falls dieser Code zur Authentifizierung verwendet wird, würde dieses Beispiel einen gültigen Benutzernamen aus der Datenbank auswählen, denn '1' = '1' ist immer wahr.

Das ganze funktioniert selbstverständlich auch mit Passwörtern. Nehmen wir uns einen Benutzernamen, beispielsweise Admin, und lassen uns das Passwort, wieder mit der Zeichenkette ' or '1'='1, aus der Datenbank ausgeben:

 
sql
1
SELECT * FROM users WHERE name = 'admin' AND user_pwd = '' OR '1'='1';

Damit loggen wir uns als Admin ein, haben alle Rechte und können anstellen was wir wollen.

Folgende Eingabe würde die Tabelle users Löschen und alle Daten der Tabelle userinfo auslesen, wenn eine API genutzt wird, die mehrere Statements erlaubt.

 
sql
1
a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't

Diese Eingabe würde dieses SQL Statement generieren:

 
sql
1
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';

Die meisten SQL Server Implementierungen unterstützen mehrere Statements bei einem Aufruf, wenige, wie beispielsweise PHP's mysql_query(), unterbinden das aus Sicherheitsgründen.

Gegenmaßnahmen:

Eine wichtige Gegenmaßnahme besteht darin, Metazeichen in Benutzereingaben auszufiltern oder zu Maskieren (Escapen). Hierdurch kann die Gefahr von SQL-Injections gemildert oder sogar beseitigt werden.

Der sicherste Weg ist jedoch, die Daten vom SQL-Interpreter fernzuhalten. Dabei werden gebundene Parameter in Prepared Statements verwendet. Hierbei werden die Daten als Parameter an einen bereits kompilierten Befehl übergeben. Die Daten werden somit nicht interpretiert und eine SQL-Injection verhindert.

Beispiel in PHP:

Statt folgendem Aufruf für MySQL

 
PHP
1
2
3
4
5
6
7
<?php
$abfrage = "SELECT spalte1 
            FROM tabelle 
            WHERE spalte2 = '".$_POST['spalte2Wert']."'"; 

$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
?>

sollte die Abfrage so verwendet werden:

 
PHP
1
2
3
4
5
6
7
<?php
$abfrage = "SELECT spalte1 
            FROM tabelle 
            WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'"; 

$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
?>

Fazit:

SQL-Injections sollten auf keinem Fall unterschätzt werden, durch fehlende Filterung bzw. Maskierung können Daten ausgelesen, manipuliert oder gelöscht werden. Schlimmsten Falls erreicht der Angreifer sogar die Kontrolle des Servers. Dabei sind die Gegenmaßnahmen nicht weiter schwer zu implementieren. Viele Frameworks Escapen bereits automatisch, so dass sich der Webentwickler darum gar nicht erst kümmern muss.

zurück zur Übersicht Web-Sicherheit


Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 2 Personen an der Seite "SQL-Injection" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "SQL-Injection" hier bearbeiten.

Mitarbeiter