Hauptmenü

Untermenü

Sicher programmieren - SQL-Injections Teil 1

1. Die Abschnitte

2. Die Ausgangssituation

Wie ich schon sagte, will der Betreiber unseres Foltershops seinen Stammkunden einen Rabatt anbieten. Dazu müssen die nur ihre E-Mail und ihr Passwort eingeben. Auch hier hat unser "Programmierer" mal wieder heftig geschlampt. Und das nutzen wir natürlich aus. Allerdings solltet ihr euch schon mit dem korrekten Gebrauch von Zeichenkettenverknüpfungen vertraut sein.

3. Vorbereitung

Die Datei befindet sich im Ordner sql_injections und schimpft sich login.php. Aber vorher wollen wir eine Einstellung ändern, damit ihr etwas über mangelhaft konfigurierte Server erfährt. Öffnet dazu nun die Datei php.ini. Erfahrungsgemäß gibt es je nach System eine oder mehrere davon. Daher müsst ihr herausfinden, welche die richtige ist. Sucht auf jeden Fall nach dem Eintrag magic_quotes_gpc. Wenn der auf On steht (was er auch sollte), so ändert man den Wert in Off.

Anschließend müsst ihr den Apache neu starten. Dann ruft ihr mal die Datei phpinfo.php im Hauptordner sicher_programmieren per Browser auf, und sucht nach magic_quotes_gpc. Wenn dort der Wert auf Off steht, habt ihr die richtige php.ini erwischt. Ansonsten müsst ihr die anderen auch noch durchgehen.

Lektion 1 und 2

Dass die Einstellung von magic_quotes_gpc auf Off keine gute Idee ist, könnt ihr euch sicher schon denken. Aber dann auch noch eine Datei auf den Server liegen zu haben, die genau so heißt wie die Killer-Funktion phpinfo(); ist wirklich unter aller Sau. Denn wenn ein Hacker durch Raten herausfindet, wie die Datei lautet, so habt ihr, wie ich schon sagte, ein Problem. Und wenn der dann noch sieht, dass es bei euch die folgende Schwachstelle gibt, dann gute Nacht.

4. Der Hack via SQL-Injection

Tippert zuerst mal irgendeinen Blödsinn in die beiden Felder der login.php. Da seht ihr dann auch, dass ihr keinen Zugriff bekommt. Aber was passiert, wenn man in beide(!) Felder ein bla' OR '1=1 eingibt? Da ist man auf einmal als Stammkunde angemeldet! Das seht ihr an der Meldung "Jau, hast du!" und dem neuen Link "Zur Übersicht".

Wie das funktioniert ist ganz einfach zu erklären. Gebt euch mal die SQL-Abfrage mittels echo '<pre>'.$query.'</pre>'; aus. Und das Ergebnis sieht dann so aus.


SELECT
  kunde
FROM 
  rabatt
WHERE mail='bla' OR '1=1'
  AND passwort 'bla' OR '1=1'

Der Hack funktioniert also durch den geschickten Einsatz von Hochkommata, mit denen man in SQL Zeichenketten eingrenzt. So wird dann aus einen WHERE name=\''.$_POST['name'].'\' ein WHERE name='bla' OR '1=1'. Es gibt aber noch eine weitere Schwachstelle in der Programmierung. Denn es wird nicht überprüft, wie viele Stammkunden es bei den eingegebenen Daten geben könnte. Eigentlich sollte es nur einer sein, aber das ist eine andere Geschichte.

5. Gegenmaßnahme

Stellt in der php.ini den Wert von magic_quotes_gpc wieder auf On und startet den Apache neu. Danach wird euer Hack nicht mehr funktionieren, weil diese Einstellung automatisch bestimmte Zeichen wie das ' escaped, also mit einem \ maskiert. Die Abfrage sieht dann so aus und lässt den Hack nicht mehr zu:


SELECT
  kunde
FROM 
  rabatt
WHERE mail='bla\' OR \'1=1'
  AND passwort 'bla\' OR \'1=1'

Aber!

Wer denkt, dass diese Einstellung grundsätzlich vor SQL-Injections schützt, dem muss leider sagen, nö, nicht immer. Und das erfahrt ihr nun.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt