File-Inclusion-Schwachstellen in Webanwendungen verstehen

Beginner

Einführung

Willkommen zu unserem anfängerfreundlichen Kurs über Schwachstellen in Webanwendungen, der sich speziell auf File Inclusion (Dateieinbindung) Schwachstellen konzentriert, welche zu den häufigsten Problemen in Webanwendungen gehören.

In diesem Modul beginnen wir damit, das Konzept der „Dateieinbindung“ im Kontext von Webanwendungen zu analysieren. Darauf aufbauend werden wir erläutern, was eine „File Inclusion Vulnerability“ (Schwachstelle bei Dateieinbindung) ausmacht. Abschließend werden wir uns mit den beiden Hauptkategorien von File Inclusion Schwachstellen befassen.

Im folgenden Abschnitt dieses Moduls werden wir tiefer in „Local File Inclusion Vulnerabilities“ (Schwachstellen bei lokaler Dateieinbindung) und „Remote File Inclusion Vulnerabilities“ (Schwachstellen bei entfernter Dateieinbindung) eintauchen, um Ihnen ein umfassendes Verständnis dieser kritischen Sicherheitsprobleme zu vermitteln.

Wichtige Lernergebnisse
  • Das grundlegende Konzept der Dateieinbindung in Webanwendungen verstehen.
  • Die zugrunde liegenden Prinzipien von File Inclusion Schwachstellen erfassen.
  • Die beiden Haupttypen von File Inclusion Schwachstellen kennenlernen: Lokal und Remote.

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:

  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 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:

  1. Statische Einbindung (Static inclusion)
  2. 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.

Grundlagen der Dateieinbindungs-Sicherheitslücke verstehen

Wir haben kürzlich gelernt, wie man die Datei echo.php einbindet, indem man den file-Parameter in lfi_dynamic.php verwendet. Nun stellt sich eine Frage:

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

Die Antwort ist ein klares Ja!

Wenn der Webentwickler es versäumt, den file-Parameter zu validieren, kann dieser potenziell ausgenutzt werden, um sensible Dateien auf dem Server einzubinden.

Hier sind einige Beispiele:

  • Auf einem Linux-System könnten Sie in der Lage sein, die Datei /etc/passwd einzubinden.
  • Auf einem Windows-System könnten Sie möglicherweise die Datei C:\Windows\System32\drivers\etc\hosts einbinden.

Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Angenommen, 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, Sie werden sehen, dass wir den Inhalt der Datei /etc/passwd erfolgreich eingebunden und angezeigt haben. Dies deutet auf das Vorhandensein einer Local File Inclusion (LFI) Schwachstelle hin, was ein ernstes Sicherheitsproblem darstellt.

Denken Sie daran: Das Verständnis dieser Schwachstellen ist der erste Schritt zu deren Verhinderung. Stellen Sie immer sicher, dass Sie alle Benutzereingaben in Ihren Webanwendungen validieren und bereinigen (sanitizen).

Arten von Dateieinbindungs-Sicherheitslücken

File Inclusion Schwachstellen, ein kritisches Problem in der Websicherheit, werden im Allgemeinen in zwei Haupttypen unterteilt:

  1. Local File Inclusion (LFI): Diese Art von Schwachstelle tritt auf, wenn lokale Dateien auf dem Zielserver eingebunden werden.

  2. Remote File Inclusion (RFI): Diese Art von Schwachstelle tritt auf, wenn Dateien, die sich auf einem anderen, entfernten Server befinden, eingebunden werden.

In dem Beispiel, das wir zuvor besprochen haben, ist die Einbindung der lokalen Datei /etc/passwd ein Paradebeispiel für eine Local File Inclusion (LFI) Schwachstelle. Das Verständnis der Unterscheidung zwischen diesen beiden Arten von Schwachstellen ist entscheidend, um Ihre Webanwendungen effektiv abzusichern.

Zusammenfassung

In diesem Lab haben Sie die Methode und den Prozess zur Initiierung eines Angriffs über die File Inclusion Funktionalität gelernt. Lassen Sie uns die wichtigen Punkte dieser Sektion rekapitulieren:

  • Was ist File Inclusion?
  • Was ist eine File Inclusion Schwachstelle?
  • Was sind die zwei Arten von File Inclusion Schwachstellen?