Hauptmenü

Untermenü

Sicher programmieren - GET-Parameter

1. Die Abschnitte

2. Die ersten Hacks

So jetzt geht es los. Wir wollen mal anhand zweier einfacher Beispiel an Informationen kommen, die uns eigentlich gar nichts angehen. Dabei konzentrieren wir uns zunächst mal auf den Ordner get_1, damit ihr das Prinzip versteht.

3. GET

Diese Übertragungsmethode wird sehr gerne dann eingesetzt, wenn man auf Formulare zur Datenübermittlung verzichten will. Leider ist hier selbst für Laien der Manipulation Tür und Tor geöffnet. Denn die Links sind sofort zu identifizieren und viel leichter zu verändern als POST-Werte. Das kann man in etlichen Foren ausprobieren, denn da sehen Links sehr oft so aus: www.meinforum.de/show.php?thread=1425. Wenn man nun die 1425 ändert, so bekommt man etwas anderes zu sehen. Und das nutzen wir jetzt aus.

4. Login

Ruft nun die login.php in besagtem Ordner get_1 auf und gebt bei der Kundennummer 1001 und beim Passwort bla ein. Damit habt ihr euch ordnungsgemäß identifiziert und habt als Hersteller einen Zugriff auf eure Daten. Dazu müsst ihr nur auf den Link Daten auflisten klicken.

Aber was ist passiert?

Ganz einfach, in der login.php fragt ihr die Kundennummer und das Passwort aus der Tabelle hersteller ab.


$query 'SELECT
            id,
            zulieferer
          FROM 
            hersteller
          WHERE kd_nr=\''.$_POST['kd_nr'].'\'
            AND pw = \''.$_POST['pw'].'\'';
$res        mysql_query ($query);
$hersteller mysql_fetch_assoc($res);

Und wenn die Authentifizierung geklappt hat, so erzeugt ihr den entsprechenden Link, wo ihr die ID des besagten Herstellers als Parameter übergebt.


if (empty($hersteller))
{
  ...
}
else
{
  echo '<a href="show_data.php?id='.$hersteller['id'].'">
          Daten auflisten
        </a>';
}

5. Der erste Hack

Nachdem ihr auf den Link geklickt habt, sieht die URL zum Beispiel so aus: http://localhost/sicher_programmieren/get_1/show_data.php?id=1. So weit, so gut. Aber jetzt macht mal aus dem id=1 ein id=3. Et voilà! Auf einmal bekommt ihr die Daten eines eurer Konkurrenten zu Gesicht, inklusive Passwort!

6. Der zweite Hack

... sieht ein wenig anders aus, ist aber vom Prinzip her dasselbe. Dazu ruft ihr einfach die login.php im Ordner get_2 auf. Hier geht es um Kunden (nicht Hersteller), die in unserem Shop einen Rabatt bekommen, wenn sie online bestellen. Da nehmt ihr als E-Mail geilerhengst23@aol.com und als Passwort blubb. Tipp: schaut mal in die Tabelle rabatt eurer Datenbank.

Hier wird genau wie im ersten Fall eine Authentifizierung vorgenommen. Wenn sie erfolgreich ist, so erfolgt eine automatische Weiterleitung, wobei auch hier die ID aus der Tabelle rabatt übergeben wird.


$query 'SELECT
            k.id
          FROM 
            kunde k,
            rabatt r
          WHERE r.mail=\''.$_POST['name'].'\'
            AND r.passwort = \''.$_POST['pw'].'\'
            AND r.kunde = k.id';
$res   mysql_query ($query);
$kunde mysql_fetch_assoc($res);

if (!empty($kunde))
{
  header ('Location: change_data.php?id='.$kunde['id']);
}
else
{
  $mess 'Falsche Zugangsdaten';
}

Ganz schlimm

Nun landen wir auf einer Seite, wo man seine Kundendaten ändern kann. Sieht nicht wild aus, aber was passiert, wenn man besagte ID im GET-Parameter wieder ändert? Da wir nur zwei Einträge in der Tabelle haben, funktioniert hier nur die 4. Aber auf einmal bekommen wir alle Daten eines anderen Kunden zu Gesicht. Wir können also nicht nur sein Passwort nutzen, sondern es auch verändern. Wenn die Funktionalität eingebaut wäre ;-).


if (!empty($_POST))
{
  // Hier werden die Daten geändert
}

7. Schlussfolgerung

Passt um Gottes Willen fürchterlich auf, wenn ihr Werte per GET übergebt! Denn die können selbst Dödel nach ein paar Versuchen manipulieren! Und bitte speichert eure Passwörter niemals im Klartext in der Datenbank ab. Nutzt dazu die PHP-Funktion md5 oder noch besser sha1. Und zwar sowohl für die Eingabe als auch für das Auslesen.

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