Grundlagen zu Dateieinbindungs-Sicherheitslücken in Webanwendungen

Beginner

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Willkommen in unserem anfängerfreundlichen Kurs über Sicherheitslücken in Webanwendungen, insbesondere über Dateieinbindungs-Sicherheitslücken, die zu den häufigsten Problemen in Webanwendungen gehören.

In diesem Modul werden wir zunächst das Konzept der 'Dateieinbindung' im Kontext von Webanwendungen analysieren. Anschließend bauen wir auf dieser Grundlage auf, um zu erklären, was eine 'Dateieinbindungs-Sicherheitslücke' ausmacht. Schließlich werden wir uns den beiden Hauptkategorien von Dateieinbindungs-Sicherheitslücken nähern.

Im folgenden Abschnitt dieses Moduls werden wir uns eingehender mit 'Lokalen Dateieinbindungs-Sicherheitslücken' und 'Remote-Dateieinbindungs-Sicherheitslücken' befassen und Ihnen ein umfassendes Verständnis dieser kritischen Sicherheitsaspekte vermitteln.

Wichtige Lernergebnisse
  • Grundlegendes Verständnis des Konzepts der Dateieinbindung in Webanwendungen erlangen.
  • Die zugrunde liegenden Prinzipien von Dateieinbindungs-Sicherheitslücken verstehen.
  • Über die beiden Haupttypen von Dateieinbindungs-Sicherheitslücken lernen: Lokale und Remote.

Skills Graph

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:

  1. include()
  2. require()
  3. include_once()
  4. 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:

  1. Statische Einbindung
  2. 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.

Das Verständnis von Dateieinbindungs-Sicherheitslücken

Wir haben kürzlich gelernt, wie man die echo.php-Datei mithilfe des file-Parameters in lfi_dynamic.php einbindet. Aber eine Frage stellt sich:

Ist es möglich, andere Dateien mithilfe des file-Parameters einzubinden?

Die Antwort ist ein klares Ja!

Wenn der Webentwickler die Validierung des file-Parameters vernachlässigt, kann dieser potenziell ausgenutzt werden, um sensible Dateien auf dem Server einzubinden.

Hier sind einige Beispiele:

  • Auf einem Linux-System könnte man möglicherweise die /etc/passwd-Datei einbinden.
  • Auf einem Windows-System könnte man möglicherweise die C:\Windows\System32\drivers\etc\hosts-Datei einbinden.

Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Nehmen wir an, wir setzen den file-Parameter auf /etc/passwd:

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

Öffnen Sie die URL im Browser, und Sie werden sehen, dass wir erfolgreich den Inhalt der /etc/passwd-Datei eingebunden und angezeigt haben. Dies deutet auf das Vorhandensein einer Lokalen Dateieinbindungs-Sicherheitslücke (Local File Inclusion, LFI) hin, die ein ernsthaftes Sicherheitsrisiko darstellt.

Denken Sie daran, dass das Verständnis dieser Sicherheitslücken der erste Schritt zum Schutz vor ihnen ist. Stellen Sie immer sicher, dass alle Benutzereingaben in Ihren Webanwendungen validiert und bereinigt werden.

Arten von Dateieinbindungs-Sicherheitslücken

Dateieinbindungs-Sicherheitslücken, ein kritisches Problem in der Web-Sicherheit, werden im Allgemeinen in zwei Haupttypen unterteilt:

  1. Lokale Dateieinbindungs-Sicherheitslücke (Local File Inclusion, LFI): Dieser Typ von Sicherheitslücke tritt auf, wenn lokale Dateien auf dem Zielserver eingebunden werden.

  2. Remote-Dateieinbindungs-Sicherheitslücke (Remote File Inclusion, RFI): Dieser Typ von Sicherheitslücke tritt auf, wenn Dateien von einem anderen, entfernten Server eingebunden werden.

Im Beispiel, das wir zuvor besprochen haben, ist die Einbindung der lokalen /etc/passwd-Datei ein klassisches Beispiel für eine Lokale Dateieinbindungs-Sicherheitslücke (Local File Inclusion, LFI). Das Verständnis des Unterschieds zwischen diesen beiden Typen von Sicherheitslücken ist entscheidend, um Ihre Webanwendungen effektiv zu sichern.

Zusammenfassung

In diesem Lab haben Sie die Methode und den Prozess gelernt, wie man einen Angriff über die Dateieinbindungsfunktion initiiert. Lassen Sie uns die wichtigen Punkte in diesem Abschnitt noch einmal zusammenfassen:

  • Was ist Dateieinbindung?
  • Was ist eine Dateieinbindungs-Sicherheitslücke?
  • Welche zwei Arten von Dateieinbindungs-Sicherheitslücken gibt es?