4 Min

Die Schnittstelle zwischen Webserver und dem Rest,

CGI (also das Common Gateway Interface) sendet Anfragen von Clients (z.B. Browsern) an Webserver. CGI ermöglicht es, dass Webserver Programme (z.B. in Python, Perl, C oder Shell-Skripten) ausführen und deren Ausgabe als HTML-Seiten an den Browser zurückschicken. Es ist eine der ältesten Methoden, um dynamische Inhalte auf Webseiten zu erzeugen.

Funktionsweise von CGI

  1. Anfrage vom Browser: Ein Benutzer schickt eine Anfrage an den Webserver, typischerweise durch Aufrufen einer URL, die auf ein CGI-Skript verweist.

  2. Server führt Programm aus: Der Webserver startet das entsprechende CGI-Programm, indem er die Anfrageparameter (z.B. Formularwerte) an das Programm übergibt.

  3. Programm verarbeitet die Daten: Das CGI-Programm verarbeitet die Daten, generiert dynamische Inhalte und sendet die Ausgabe (z.B. eine HTML-Seite) zurück an den Webserver.

  4. Antwort an den Browser: Der Webserver sendet die vom CGI-Programm erzeugte Antwort an den Browser des Benutzers zurück.

CGI war in den 1990er Jahren eine der wichtigsten Technologien zur Erzeugung dynamischer Webinhalte, wurde jedoch mittlerweile weitgehend durch effizientere Methoden wie PHP, Python-basierte Frameworks (z.B. Flask, Django) oder serverseitiges JavaScript (Node.js) abgelöst.

Sicherheitsrisiken und Hacks im Zusammenhang mit CGI

CGI-Skripte, insbesondere schlecht implementierte, können zahlreiche Sicherheitslücken enthalten, die von Angreifern ausgenutzt werden können. Hier sind einige der häufigsten Sicherheitsprobleme und potenzielle Angriffe:

1. Command Injection (Befehlseinschleusung)

  • Beschreibung: Ein häufiges Problem bei CGI-Skripten besteht darin, dass Benutzereingaben ungefiltert in Systembefehle eingebunden werden. Wenn ein CGI-Skript z.B. Benutzereingaben in eine Shell-Befehlskette einfügt, kann ein Angreifer beliebige Befehle auf dem Server ausführen.
  • Beispiel:
    • Angreifer gibt einen schädlichen Wert in ein Formularfeld ein:
      ; rm -rf / # (Linux-Befehl zum Löschen aller Dateien auf dem Server)
      
    • Wenn das CGI-Skript diesen Wert ohne Validierung in einen Shell-Befehl einfügt, wird dieser Befehl ausgeführt und kann den Server schwer beschädigen.
  • Schutzmaßnahmen: Alle Benutzereingaben sollten gefiltert und sicher validiert werden. Benutzerinputs dürfen nie direkt in Systembefehle eingefügt werden.

2. Path Traversal

  • Beschreibung: Bei einem Path Traversal-Angriff verwendet ein Angreifer relative Pfadangaben (wie ../../etc/passwd), um auf Dateien oder Verzeichnisse zuzugreifen, die außerhalb des Webroot-Verzeichnisses liegen. Schlecht gesicherte CGI-Skripte können zulassen, dass Angreifer vertrauliche Dateien lesen.
  • Beispiel:
    • Eine URL könnte wie folgt aussehen: http://example.com/cgi-bin/script.cgi?file=../../../../etc/passwd, was zum Zugriff auf die Passwortdatei eines Linux-Servers führt.
  • Schutzmaßnahmen: CGI-Skripte sollten den Zugriff auf Dateipfade restriktiv gestalten und sicherstellen, dass keine relativen Pfade in Benutzereingaben akzeptiert werden.

3. Unsichere Dateizugriffe

  • Beschreibung: Viele CGI-Skripte bieten Funktionen zum Lesen und Schreiben von Dateien basierend auf Benutzereingaben. Ein Angreifer kann durch Manipulation der Eingaben auf nicht autorisierte Dateien zugreifen oder Dateien mit schädlichem Inhalt hochladen.
  • Beispiel:
    • Ein Upload-Skript ermöglicht es einem Angreifer, eine Datei mit einem gefährlichen Skript oder Schadsoftware hochzuladen, die dann auf dem Server ausgeführt werden kann.
  • Schutzmaßnahmen: Es sollten strikte Dateitypvalidierungen implementiert werden, um nur vertrauenswürdige Dateitypen zuzulassen. Zugriffsrechte auf Dateien sollten auf das notwendige Minimum beschränkt werden.

4. Cross-Site Scripting (XSS)

  • Beschreibung: XSS-Angriffe treten auf, wenn CGI-Skripte Eingaben eines Benutzers direkt auf einer Webseite ausgeben, ohne sie zu filtern oder zu escapen. Dadurch kann schädlicher JavaScript-Code in die Seite eingeschleust werden, der auf die Daten anderer Benutzer zugreifen kann.
  • Beispiel:
    • Ein CGI-Skript gibt den Benutzernamen zurück, ohne ihn zu escapen. Ein Angreifer könnte folgenden Input senden:
      <script>alert('Hacked!')</script>
      
    • Dieser Code würde dann im Browser anderer Benutzer ausgeführt werden.
  • Schutzmaßnahmen: Benutzereingaben sollten immer richtig gefiltert oder escaped werden, bevor sie in HTML-Seiten ausgegeben werden.

5. Denial of Service (DoS)

  • Beschreibung: Schlecht optimierte CGI-Skripte können auch für Denial-of-Service-Angriffe anfällig sein. Wenn ein CGI-Skript sehr rechenintensive Aufgaben ausführt oder viele Systemressourcen benötigt, kann ein Angreifer durch übermäßige Anfragen den Server überlasten.
  • Beispiel:
    • Ein Angreifer sendet eine große Anzahl von Anfragen an ein CGI-Skript, das auf jeder Anfrage aufwändige Rechenoperationen durchführt oder Dateien erstellt. Dies kann zu einer Überlastung des Servers führen.
  • Schutzmaßnahmen: CGI-Skripte sollten optimiert sein und Ressourcenbeschränkungen implementieren, z.B. durch die Begrenzung der Ausführungszeit und der Größe von Eingaben.

6. Directory Listing und Fehlkonfigurationen

  • Beschreibung: Manchmal ist der Zugriff auf das Verzeichnis, in dem CGI-Skripte liegen, nicht richtig konfiguriert, sodass Benutzer die Skripte direkt aufrufen oder sogar deren Quellcode sehen können. Wenn Verzeichnisse wie /cgi-bin/ öffentlich zugänglich sind, können Angreifer Informationen über die Struktur des Systems erhalten oder alte, unsichere Skripte ausführen.
  • Beispiel:
    • Ein Angreifer kann einfach die URL http://example.com/cgi-bin/ aufrufen und eine Liste aller dort befindlichen Skripte sehen, darunter möglicherweise unsichere oder veraltete Versionen.
  • Schutzmaßnahmen: Verzeichnisse, in denen CGI-Skripte gespeichert sind, sollten vor direktem Zugriff geschützt werden. Verzeichnislisting muss deaktiviert und alte Skripte entfernt werden.

Fazit

Das Common Gateway Interface (CGI) bietet zwar eine einfache Möglichkeit, dynamische Webinhalte zu erstellen, bringt aber auch eine Vielzahl von Sicherheitsrisiken mit sich, insbesondere wenn Skripte schlecht programmiert oder konfiguriert sind. Durch unsichere Programmierpraktiken können Angreifer verschiedene Techniken nutzen, um Server zu kompromittieren, sensible Informationen zu stehlen oder schädliche Aktionen auszuführen.

Moderne Alternativen zu CGI wie PHP, Node.js oder Frameworks wie Flask oder Django bieten robustere Sicherheitsmechanismen, während sie gleichzeitig bessere Performance und Skalierbarkeit bieten. Falls CGI dennoch verwendet wird, ist es entscheidend, Sicherheitsmaßnahmen wie Eingabevalidierung, Berechtigungsmanagement und Output-Escaping umzusetzen, um mögliche Angriffe zu verhindern.

Updated: