Benutzer:Raf-dat/Penetration Testing/SQL-Injection

Aus Wikibooks

Als SQL-Injection (häufig auch MySQL-Injection) bezeichnet man, eigene SQL-Befehle durch eine Lücke im PHP-Skript auszuführen.

Exkurs: SQL[Bearbeiten]

Hinter den meisten dynamischen Webseiten laufen Datenbanken. Diese speichern Daten, die immer wieder verändert und dann neu gespeichert werden. Wenn man dazzu jedes mal eine Datei öffnen, den Inhalt auslesen, den Inhalt neu setzen und die Datei abspeichern müsste, würde das Leistung und Zeit kosten.

Diese SQL-Datenbanken werden mit der Sprache SQL gesteuert. Es gibt Softwarepakete, die das Ganze grafisch darstellen (z. B. phpMyAdmin), aber schlussendlich schicken auch diese SQL-Abfragen ab.

In PHP sieht das so aus:

<?php
$m = mysqli_open("localhost", "benutzer", "pass", "db01"); // Öffnet eine Verbindung auf localhost (der Server auf dem das Skript läuft) als Benutzer
                                                           // "benutzer" mit Passwort "pass" und wählt "db01" als Standarddatenbank für Abfragen aus

$r = mysqli_query($m, "SELECT * FROM blog WHERE id=1;");   // Führt in der Verbindung $l (oben) den beschriebenen Query aus und speichert den
                                                           // Rückgabewert in $r
while($result = $r) {
  echo $result["text"]."<br />";                           // Jede Zelle der Spalte "text" mit id=1 wird einzeln ausgegeben
}

mysqli_close($m);                                          // Schliesst die MySQL-Verbindung
?>

SQL-Injection[Bearbeiten]

Nun kommt es häufig vor, dass jemand eine Suchfunktion auf seiner Seite hat. Die zu durchsuchenden Inhalte sind in einer Datenbank gespeichert. Der Suchstring wird mit der URL übergeben:

<?php
$m = mysqli_open("localhost", "benutzer", "pass", "db01");

$r = mysqli_query($m, "SELECT * FROM seiten WHERE text LIKE '%".$_GET["string"]."%';");
if(mysqli_num_rows($r) == 0) {
  echo "Die Suche ergab leider keinen Treffer!";
} else {
  while($result = $r) {
    echo ... // Irgendein Konstrukt um die Daten der Seite auszugeben
  }
}

mysqli_close($m);
?>

Wenn er nach "Foobar" sucht, sieht die Query-Zeile so aus:

$r = mysqli_query($m, "SELECT * FROM seiten WHERE text LIKE '%Foobar%';");

Die Ergebnisse werden säuberlich gelistet.

Der böse Angreifer lässt sich aber etwas einfallen und gibt ein: asdf%'; DROP DATABASE db01; /*
Das hat fatale Folgen, denn jetzt sieht die Zeile so aus:

$r = mysqli_query($m, "SELECT * FROM seiten WHERE text LIKE '%asdf%'; DROP DATABASE db01; /*%';");

Der Anfang der Suchanfrage stimmt zwar, aber dann bricht der Angreifer aus der Syntax aus und führt seinen eigenen Befehl aus, der die Datenbank löscht. Die Zeichenfolge /* führt einen Kommentar ein und damit wird der Rest des Querys ignoriert.

Blinde SQL-Injection[Bearbeiten]

Absicherung gegen SQL-Injection[Bearbeiten]

Beispiele[Bearbeiten]

Weiterführende Links[Bearbeiten]