Sicher programmieren - SQL-Injections Teil 1
1. Die Abschnitte
- Einführung
- Informationen
- Desinformation
- GET-Parameter
- POST-Werte
- JavaScript-Hacks
- SQL-Injections Teil 1
- SQL-Injections Teil 2
- Dateiuploads Teil 1
- Dateiuploads Teil 2
- Brute-Force-Attacken
- Webhosting
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