Das Verständnis von Dateieinbindung
Lassen Sie uns uns dem Konzept der "Dateieinbindung" und ihren potenziellen Sicherheitslücken nähern, speziell für Anfänger zugeschnitten.
Die Dateieinbindung ist eine gängige Praxis in der Programmierung, insbesondere im Zusammenhang mit der Wiederverwendbarkeit von Code. Entwickler kapseln oft häufig verwendete Funktionen oder Module in separate Dateien. Wenn diese Funktionen oder Module benötigt werden, fügen sie einfach diese Dateien in ihren Code ein, ohne den gleichen Code wiederholt schreiben zu müssen.
In PHP gibt es vier primäre Funktionen 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 wird fortgesetzt.
require()
: Diese Funktion bindet eine Datei ein, bevor das Skript startet. 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()
, aber sie stellen sicher, dass die Datei nur einmal eingebunden wird, auch wenn die Funktion mehrmals aufgerufen wird.
Dateieinbindungsmethoden können grob in zwei Typen kategorisiert werden:
- Statische Einbindung
- Dynamische Einbindung
Der Unterschied zwischen diesen beiden Typen wird in den folgenden Abschnitten anhand eines Beispiels erklärt.
In unserem Kurs werden wir drei .php
-Dateien im Verzeichnis /home/labex/project/
untersuchen. Dies sind:
lfi_static.php
lfi_dynamic.php
echo.php
Lassen Sie uns verstehen, was jede Datei tut:
-
lfi_static.php
: Diese Datei bindet die echo.php
-Datei statisch ein. Mit anderen Worten, der Pfad zur echo.php
-Datei ist hart kodiert und ändert sich nicht. Diese Methode ist sicher und birgt keine Sicherheitslücken.
<?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 einfach einen Hinweis zur Verwendung. 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.
Wenn das Image erstellt ist, können Sie es verwenden, um einen Container zum Testen der lfi
-Sicherheitslücke zu starten:
docker run -d --name lfi -p 80:80 lfi-image
Jetzt können Sie diese Dateien in Ihrem Browser testen. Beispielsweise würden Sie die folgende URL eingeben, um auf die lfi_static.php
-Datei zuzugreifen:
http://127.0.0.1/LFI/lfi_static.php
Sie werden sehen, dass die lfi_static.php
-Datei den Inhalt der echo.php
-Datei erfolgreich einbindet. Denken Sie daran, dass diese statische Methode der Dateieinbindung sicher ist.
Jetzt schauen wir uns die lfi_dynamic.php
-Datei an. Greifen Sie auf sie über diese URL zu:
http://127.0.0.1/LFI/lfi_dynamic.php
Sie werden eine Anweisung sehen, dass Sie den 'file'-Parameter verwenden sollen. Lassen Sie uns das tun und echo.php
einbinden:
http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php
Sie werden sehen, dass echo.php
erfolgreich eingebunden wird. Dies zeigt, wie die Dateieinbindung funktioniert. Es ist wichtig zu beachten, dass obwohl dies ein PHP-Beispiel ist, die Prinzipien auch auf andere Programmiersprachen zutreffen, auch wenn die verwendeten spezifischen Funktionen unterschiedlich sein können.