Hauptmenü

Untermenü

Sicher programmieren - SQL-Injections Teil 2

1. Die Abschnitte

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=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