Sicher programmieren - GET-Parameter
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 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