php-resource.de

PHP/ PHP INSTALLATION (WAMP und LAMP) Tutorial: Webserver, Sicherheit ist realisierbar

Diese Facharbeit beschäftigt sich mit dem Herzstück eines Netzwerkes, dem Webserver.

|23.06.2006 | me1@ | 8788 | KAT : PHP/ PHP INSTALLATION (WAMP und LAMP) | | Kommentare 0


7

10

3.2. Daten von außerhalb - globale Variablen

3.2.1. automatisch globale Variablen

Sehr einfach ist das Übermitteln von Werten an ein PHP Script. In der Standardeinstellung werden alle Werte, die über GET-, POST- oder Cookie- Methoden kommen, automatisch im Programmprozess eingefügt. Sie existieren als globale Variablen und können im gesamten Programm verwendet werden.
Allerdings können durch diese Technik auch ungewünschte Variablen entstehen. Trotz einer fiktiven Vertrauensgrenze werden sie ungewollt hereingeholt.

Beispiel:

"quelltext.php?datei=beispiel"

Ohne Unstände kann man nun die Variable $datei mit dem Inhalt "beispiel" im Programm benutzen.

Diese Technik kann ebenso zu gravierenden Sicherheitslücken führen:

if ($pass == "hallo") $auth = 1;
if ($auth == 1) echo "Dies ist ein geheimer Text!";

Die erste Zeile dieses Programms prüft, ob die Variable $pass den Wert "hallo" hat. Trifft dies zu, so wird die Variable $auth auf den Wert 1 gesetzt.
Die zweite Zeile vergleicht $auth mit dem Wert 1. Trifft auch dies zu, so wird der geheime Text ausgegeben.

Der Programmierer geht davon aus, dass $auth solange leer bleibt, bis ein Wert gesetzt wird. Doch folgender Aufruf der Seite würde den Passwortschutz sinnlos machen:

"passwort.php?pass=mir_egal&auth=1"

Egal, welchen Wert die Variable $pass bekommt, $auth wird schon zum Start des Programms auf 1 stehen. Der korrekte Code müsste demnach so aussehen:

$auth = 0;
if ($pass == "hallo") $auth = 1;
if ($auth == 1) echo "Dies ist ein geheimer Text!";

Man darf keiner Variable trauen, die man nicht explizit gesetzt hat. Bei vielen Variablen und viel Code ist dies gar kein einfaches Unterfangen.
Sicherer ist es, den Schalter "register_globals" in der "php.ini" zu schließen. Er unterbindet den automatischen Import, so dass man die benötigten Variablen nur noch aus den $HTTP_*_VARS (Tracking Variablen) erhalten kann.

Die Gefährlichkeit automatisch registrierter Variablen wurde auch von den PHP- Entwicklern erkannt. In der kommenden PHP Version (4.2.0) ist "register_globals" standardmäßig ausgeschaltet und als Ersatz für die Tracking Variablen wurden neue superglobale Äquivalente eingebaut (ab PHP 4.1.0).

3.2.2. Datei Uploads

Wie im letzten Abschnitt beschrieben, wird von der Verwendung der veralteten, automatisch globalen Variablen dringend abgeraten. Allerdings basiert ein Großteil aller PHP Scripte weiterhin auf dieser Technik. Besonders gefährdet ist das Hochladen von Dateien auf den Webserver nach der "alten" Methode. Diese existiert schon seit frühen Versionen von PHP 3 und wird leider noch oft benutzt.

Ein Upload-Formular zu erstellen ist sehr einfach. Dies ist der minimal benötigte HTML Quelltext:

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="test">
<input type="submit">
</form>

Der Browser stellt ein Feld zur Verfügung, in dem der Benutzer eine Datei auswählen kann. Ein Klick auf den "Senden" Knopf schickt die Datei mit dem HTTP- Request ab, genauer im Entity-Body der POST- Methode. PHP erkennt die eingepackte Datei und speichert sie im temporären Verzeichnis mit einem zufälligen Dateinamen ab. Im laufenden Programm setzt PHP nun vier globale Variablen, welche die hochgeladene Datei beschreiben:

$test;

  --> 

lokaler Dateiname

(z.B. "C:WINNTTEMPphp69.tmp")

$test_size

  --> 

Dateigröße in Bytes

 

$test_name 

  --> 

originale Dateiname

(z.B. "testdatei.txt")

$test_type

  --> 

Mime-Type der Datei 

(z.B. "text/plain")

Mit diesen Angaben kann man nun mit der empfangenen Datei weiterarbeiten. Ganz offensichtlich problematisch würde sich jedoch der folgende Aufruf gestalten:

upload.php?test=/etc/passwd&test_size=10240&test_type=text/plain&test_name=hello.txt

Statt an einer hochgeladenen Datei, würde ein schlecht gebautes Script mit der Passwortdatei weiterarbeiten.

Bei Datei Uploads sollte man immer das HTTP_POST_FILES bzw. das superglobale $_FILES Array benutzen. Ist man allerdings durch eine PHP 3 Installation auf die automatisch globalen Variablen angewiesen, so kann man diese mit der Funktion "is_uploaded_file" abchecken.

Das ultimative Ziel eines Angreifers ist bekanntlich, seinen eigenen Code ausführen zu können. Hier bieten File Uploads einen weiteren interessanten Aspekt. Folgende Abfrage würde ihn anfänglich daran hindern externe Dateien einzubinden:

if (file_exists($test)) include($test);

Die Funktion "file_exists" checkt auf eine existierende lokale Datei und würde eine externe Datei nicht zulassen. Dieses Script ist nicht zum Empfangen von Dateien gedacht. Doch ein selbstgebautes Formular des Angreifers, welches eine Datei als Variable "test" zum Server schickt, knackt es. PHP ist leider so freundlich, diese Datei auf der Festplatte zu speichern und die Variable $test auf den lokalen Dateinamen zu setzen. Die Prüfung mit "file_exists" besteht $test und der Code wird ausgeführt.
Hier zeigt sich wiederum, dass eine ordnungsgemäße Validierung notwendig ist und "register_globals" immer ausgeschaltet sein sollte.

Navigation -> Seitenanzahl : (10)

  «  1 2 3 4 5 6 7 8 9 10  » 
Kommentare zum Tutorial
Tutorial kommentieren
 
Über den Autor
me1@

me1@

Status
Premium Mitglied

Beruf
Unbekannt

Mitglied seit:
30.04.2009

letzte Aktivität
04.06.2009

 

Tutorial bewerten

Hat Ihnen dieses Tutorial gefallen? Dann bewerten Sie es jetzt! Fünf Sterne bedeutet "Sehr gut", ein Stern "Unzureichend".



 

aktuelle Artikel

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Neu | Berni

Wissensbestand in Unternehmen

Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Neu | Berni