Sicher programmieren - SQL-Injections Teil 2
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. Login
Nachdem ihr wisst, wie wichtig magic_quotes_gpc
ist, werde ich euch nun zeigen, wie man trotzdem eine SQL-Injection
starten kann. Ruft nun die logged_in.php
auf. Dort hat man die Möglichkeit, alle seine Mitarbeiter nach der Eingabe
des Passwort und seiner Kunden-ID aufzulisten. Gebt einfach mal blubb
und 2
ein. Oder blubber
und 4
. Dann bekommt ihr die Mitarbeiter von Dr. Quälstein oder Dr. Rostzange inklusive der Telefonnummer zu Gesicht.
3. Der Hack
... läuft genau so ab wie im vorherigen Beispiel. Allerdings benötigen wir diesmal ein gültiges Passwort. Trotzdem könnte auch ein Zahnarzt auf die Idee kommen, seinen Konkurrenten nachzuspionieren. Und das machen wir jetzt mal.
Gebt also wie gehabt euer korrektes(!) Passwort ein und bei der Kundennummer 3 OR 1=1
. Das Ergebnis ist eine ellenlange
Liste mit allen Doktoren samt aller Mitarbeiter, die sogar jedes Mal doppelt auftauchen. Das liegt an der Abfrage und der Reihenfolge
bei den Bedingungen. Denn das Ergebnis sieht zum Beispiel so aus.
SELECT
k.doktor,
k.telefon,
m.anrede,
m.name
FROM
kunde k,
mitarbeiter m,
rabatt r
WHERE m.firma=k.id
AND r.passwort='blubb'
AND id=4 or 1=1
Dass in diesem Fall alles doppelt und dreifach ausgeben wird, liegt an fehlenden Gruppierungen, aber das ist einem Hacker nicht wichtig. Er hat etliche Informationen bekommen, auf die er scharf ist.
4. Gegenmaßnahmen
Man könnte nun auf die Idee kommen, einfach die Reihenfolge des WHERE
-Abschnitts im SQL-Query zu ändern, also zum Beispiel
so.
$query = 'SELECT
k.doktor,
k.telefon,
m.anrede,
m.name
FROM
kunde k,
mitarbeiter m,
rabatt r
WHERE id='.$_POST['nummer'].'
AND m.firma=k.id
AND r.passwort=\''.$_POST['pw'].'\';
Allerdings bringt das auch nicht viel. Das Ergebnis ist zwar anders aber trotzdem nicht so wie gehofft. Daher kann man bei Zahlen zum Beispiel mit Hochkommata arbeiten, dann funktioniert der Hack nicht mehr.
$query = 'SELECT
...
FROM
...
WHERE id=\''.$_POST['nummer'].'\'
AND m.firma=k.id
AND r.passwort=\''.$_POST['pw'].'\';
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt