Grundlagen der Dateieinbindung verstehen
Lassen Sie uns in das Konzept der „Dateieinbindung“ (File Inclusion) und ihre potenziellen Schwachstellen eintauchen, speziell zugeschnitten für Anfänger.
Die Dateieinbindung ist eine gängige Praxis in der Programmierung, insbesondere im Hinblick auf die Wiederverwendbarkeit von Code. Entwickler kapseln häufig verwendete Funktionen oder Module oft in separaten Dateien. Wenn diese Funktionen oder Module benötigt werden, binden sie diese Dateien einfach in ihren Code ein, wodurch die Notwendigkeit entfällt, denselben Code wiederholt zu schreiben.
In PHP gibt es vier Hauptfunktionen für die Dateieinbindung:
include()
require()
include_once()
require_once()
Hier ist eine kurze Übersicht über jede Funktion:
include(): Diese Funktion bindet eine Datei ein, wenn sie aufgerufen wird. Wenn die Datei nicht gefunden wird, gibt PHP eine Warnung aus, aber das Skript läuft weiter.
require(): Diese Funktion bindet eine Datei ein, bevor das Skript mit der Ausführung beginnt. Wenn die Datei nicht gefunden wird, gibt PHP einen fatalen Fehler aus und stoppt das Skript.
include_once() und require_once(): Diese Funktionen funktionieren ähnlich wie include() und require(), stellen jedoch sicher, dass die Datei nur einmal eingebunden wird, selbst wenn die Funktion mehrmals aufgerufen wird.
Dateieinbindungsmethoden lassen sich grob in zwei Typen kategorisieren:
- Statische Einbindung (Static inclusion)
- Dynamische Einbindung (Dynamic inclusion)
Der Unterschied zwischen diesen beiden Typen wird in den folgenden Abschnitten anhand eines Beispiels verdeutlicht.
In unserem Kurs werden wir drei .php-Dateien untersuchen, die sich im Verzeichnis /home/labex/project/ befinden. Diese sind:
lfi_static.php
lfi_dynamic.php
echo.php
Lassen Sie uns verstehen, was jede Datei bewirkt:
-
lfi_static.php: Diese Datei bindet die Datei echo.php auf statische Weise ein. Mit anderen Worten, der Pfad zur Datei echo.php ist fest codiert und ändert sich nicht. Diese Methode ist sicher und setzt keine Schwachstellen frei.
<?php
include("./echo.php");
?>
-
lfi_dynamic.php: Diese Datei bindet andere Dateien basierend auf einem 'file'-Parameter in der URL ein. Wenn dieser Parameter nicht angegeben wird, gibt sie lediglich einen Hinweis zur Verwendung aus. Diese Methode kann jedoch riskant sein, wenn der Parameter von einem Angreifer kontrolliert wird.
<?php
if (isset($_GET['file'])) {
include($_GET['file']);
}
else{
echo "You can use the 'file' parameter to include files";
}
?>
-
echo.php: Diese Datei gibt einfach eine Erfolgsmeldung aus, wenn sie eingebunden wird.
<?php
echo 'Great, now you have successfully included the content of echo.php!'
?>
Verwenden Sie die folgenden Befehle im Terminal, um das Image für den lfi-Test vorzubereiten:
cd ~/projects
docker build -t lfi-image .
Sobald der Image-Build abgeschlossen ist, können Sie das Image verwenden, um einen Container für den Test der lfi-Schwachstelle zu starten:
docker run -d --name lfi -p 80:80 lfi-image
Nun können Sie diese Dateien in Ihrem Browser testen. Um beispielsweise auf die Datei lfi_static.php zuzugreifen, geben Sie die folgende URL ein:
http://127.0.0.1/LFI/lfi_static.php
Sie werden feststellen, dass die Datei lfi_static.php erfolgreich den Inhalt von echo.php einbindet. Denken Sie daran, dass diese statische Methode der Dateieinbindung sicher ist.
Schauen wir uns nun die Datei lfi_dynamic.php an. Greifen Sie darauf mit dieser URL zu:
http://127.0.0.1/LFI/lfi_dynamic.php
Sie sehen eine Aufforderung, den 'file'-Parameter zu verwenden. Tun wir das und binden echo.php ein:
http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php
Sie werden sehen, dass echo.php erfolgreich eingebunden wird. Dies demonstriert, wie Dateieinbindung funktioniert. Es ist wichtig zu beachten, dass dies zwar ein PHP-Beispiel ist, die Prinzipien jedoch auch für andere Programmiersprachen gelten, auch wenn die spezifisch verwendeten Funktionen unterschiedlich sein können.