Tutorials
[ Zurück ]


Webseitenangriff: SQL-Injection und Prävention


Dies ist der Erste Teil der "Wie greife ich eine Website an"-Serie

!!WICHTIG!! Die Erklärung hier dient nur der Nachvollziehbarkeit des Angriffes,
!!WICHTIG!! sie sollte auf keinen Fall bei anderen Angewendet werden!
!!WICHTIG!! Es ist eine "Know-Your-Enemie" Erklärung!!


Wir kennen es alle: Wenn ich eine Seite Programmiere, dann hoffen wir, es kommt keiner und "Hackt" diese Seite.

Wir haben angst, dass er etwas weis, über unsere Seite und "rein kommt". Was kann man dagegen tun?

Hoffen und Beten, dass "meine Seite ja so klein ist, dass er die niemals findet". Glaube mir - er wird sie finden. 

Ich will euch nicht beibringen wie ihr eure Seite 100% sicher machen könnt. Doch werde ich euch einen riesigen Stein in die Hand geben, den ihr eurem Angreifer in den weg legen könnt, sodass er hoffentlich stolpert. Das vorgehen alleine sichert euch nicht gegen alles, aber gegen s.g. "script-kiddies" ab, die "einfach mal so" eure seite "hacken" wollen. 

Gehen wir davon aus, wir haben ein einfaches loginscript nach folgendem Schema: 
<form action="login.php">
Name: <input type='text' name='user' />
Passwort: <input type='password' name='pass' />
/form>
Dann haben wir im Internet mal gegoogelt und uns gedacht: Geil! das ist ja total einfach und werten den String wiefolgt aus:
$name = $_POST["user"];
$pass = $_POST["pass"];
$sql = "SELECT id, name FROM user WHERE username = \"$name\" AND password = \"$pass\"";
$query = mysql_query($sql);
if (!$res = mysql_fetch_array($query)) {
echo "Nicht eingeloggt";
}
Dieses - oder ähnlich - habt ihr alle schon gesehen, wenn ihr das hier lest. Funktioniert super. 
Jetzt kommt aber der Böse Hacker und schreibt z.b. in den Usernamen folgendes hinein (ins password gibt er "BLABLA" ein): 
admin" AND 1=1--
Ihr denkt euch "so einen nutzer hab ich ja garnicht. Admin schon, aber das dranhängsel nicht. 
Stellen wir uns nun vor wir sind der PHP-Interpreter. Wir lesen den Query von oben und setzen ein:


SELECT id, name FROM user WHERE username = "$name" AND password = "$pass"

SELECT id, name FROM user WHERE username ="admin" AND 1=1--" AND password = "BLABLA"
(Grün aus dem String, Blau vom User)
Schon was anderes?

Jetzt kommt mySQL und interpretiert folgendes ("--" bedeutet "ab hier kommentar, das was in PHP das "//" ist.):

SELECT id, name FROM user WHERE username ="admin" AND 1=1--" AND password = "BLABLA"

Das wird einem doch anders? Mir zumindest. Er konnte sich also als Admin (oder jeder andere beliebeige user) einloggen, ohne das Passwort zu haben!
Wie verhindere ich so etwas, ohne den Stecker ziehen zu müssen?
  Ganz einfach: Der Trick bei diesem Angriff sind die Anführungsstriche, die den usernamen beendet haben und dem Angreifer ermöglicht haben, direkt den Query zu bearbeiten. Die müssen also weg!! dazu kommen noch einige andere Möglichkeiten, SQL-Injection zu betreiben, auf die ich nicht eigehen will. Diese fängt man jedoch mit der Funktion   
mysql_real_escape_string(string)
 ab. Die macht nichts anderes, als alle Zeichenketten, die in SQL etwas bedeuten auszukommentieren, also mit einem ' \ ' zu versehen. Bei euch in der Datenbank steht dann das "Richtige" und der Angreifer bekommt nurnoch die Meldung "der User "admin" AND 1=1" ist unbekannt". Wir haben ihn also vertrieben! 

Wie sicher ist diese vorgehensweise?
Sie wehrt, wie oben erwähnt, einen großteil der Angriffe ab, indem sie die Eingabe filtert. Auch können nebenbei XSS - Angriffe teilweise abgefangen werden, die auch eine große Gefahr darstellen. 

Wo sind die Schwachstellen?
Man muss bei dieser Methode immer sehr strikt vorgehen, das heißt JEDE aber wirklich JEDE eingabe des nutzers ist als Potentiell Verseucht anzusehen. Vom Nutzer kommen keine "guten" Daten, sie sind IMMER Böse! Daher müssen wirklich alle, und ich kann es nur wiederholen, ALLE Daten gefiltert werden. Potentiell jede SQL-Abfrage kann infiltriert und geändert werden (wer googeln möchte: UNION), sagt also nicht "wird schon passen". Wenn ihr ein Feld habt das auf keinen Fall verändert (also auskommentiert) werden darf, solltet ihr euch überlegen, es von PHP in BLOB umzuwandeln und in die Datenbank zu stellen, aber dennoch zu verarbeiten.

Ich hoffe ihr konntet mir folgen und ich glaube damit habe ich das Internet wieder ein Stückchen sicherer gemacht.
Und merkt euch: Die Hacker die Angreifen sind auch nur Menschen. Sie sind nur auf dem Gebiet "Netzwerksicherheit" gut bewandert, und ihr müsst sie aufhalten ;)


Weiter zum Teil 2: XSS >>


Erstellt:08.03.11 15:58
Autor: ecknecke

Letzte Änderung: 05.05.11 00:09
Geändert von: ecknecke

Bewertungen:3
Bewertung: 3.7

Freigeschaltet: Ja
Views 4234

Klicke einfach auf einen Stern!
Wollen Sie wirklich das Tutorial löschen?
Wollen Sie wirklich dieses Tutorial zulassen?
Betreff: Report tutorial [id = 472] !
Absender:
Kommentar:
Wollen Sie wirklich dieses Tutorial zulassen?
Absender:
Kommentar:
Folgende User sind hier gerade aktiv:
-

ANZEIGE