Zum Inhalt springen

SQL Injection

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 27. Mai 2004 um 17:48 Uhr durch 217.148.12.9 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

SQL Injection (zu deutsch deutsch SQL Injektion) bezeichnet das Ausnutzen einer Computersicherheits-Lücke. Der Angreifer versucht SQL Abfragen zu manipulieren. Hierzu wird über die Applikation, die den Zugriff auf die Datenbank bereitstellt, SQL Statments einzufügen.

Oft zu finden sind SQL Injection Lücken in CGI Scripten, aber auch Programme die andere Daten, etwa Webseiteninhalte oder E-Mails in SQL Datenbanken eintragen sind anfällig. Es wird versucht, weitere SQL Anforderungen einzuschleußen oder die Abfragen so zu manipulieren, dass man zusätzliche Daten erhält. Manche Datenbanksysteme bieten auch die Möglichkeit Zugriff auf eine Shell zu erhalten, womit der ganze Server kompromitierbar wird.

SQL Injection Bugs treten auf, wenn eine Applikation SQL Abfragen an den Server weiterreicht, ohne benutzerveränderbare Parameter mit Fluchtzeichen zu versehen. So sollten z.B. die Zeichen '  ; " durch \' \; \" ersetzt werden.

Beispiele

Auf einem Webserver findet sich ein Script zum Anzeigen von Artikeln:

   http://webserver/cgi-bin/find.cgi?ID=42

Dieses Script führt folgende SQL Abfrage aus:

   SELECT text FROM  WHERE artikel ID=42

Ruft nun ein Angreifer folgende URL ab

   http://webserver/find.cgi?ID=42;UPDATE%20USER%20SET%20TYPE="admin"%20WHERE%20ID=23

Führt das Script zwei Anweisungen aus:


   SELECT text FROM artikel WHERE  ID=42; UPDATE user set type="admin" where id=23

SQL Injection kann leicht durch bereits vorhandene Funktion verhindert werden. In Java wird zu diesem Zweck die PreparedStatement Klasse verwendet.

Anstatt

   Connection con = (acquire Connection)
   Statement stmt = con.createStatement();
   ResultSet rset = stmt.executeQuery("SELECT * FROM users WHERE name = '" + userName + "';");

sollte folgendes verwendet werden

   Connection con = (acquire Connection)
   PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE name = ?");
   pstmt.setString(1, userName);
   ResultSet rset = stmt.executeQuery();


In PHP wird zu diesem Zweck die Funktion mysql_escape_string() verwendet.

Anstatt

   $abfrage = "SELECT loginname, password FROM users WHERE loginname = '".$_POST['loginname']."'";
   $query = @mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");

sollte folgendes verwendet werden

   $abfrage = "SELECT loginname, password, rights FROM members WHERE loginname = '".mysql_escape_string($_POST['loginname'])."'";
   $query = @mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");


Siehe auch Cross-Site Scripting