Open Source im professionellen Einsatz

PHP: Verwirrung bei Portnummer

Wer schon einmal in PHP programmiert hat weiß, dass die »fsockopen()«-Funktion für das Öffnen von Netzwerkverbidnungen oder genauer Sockets innerhalb von PHP verwendet wird. Hierbei ist eigentlich immer eine  IP-Adresse und ein Port zu spezifizieren. Aus historischen Gründen erwartet die Funktion dafür zwei Argumente (IP-Adresse und Portnummer):

fsockopen('127.0.0.1', 80)

In diesem Beispiel würde eine Verbindung zu localhost auf Port 80 geöffnet. Seit der Einführung von Stream-Transports in PHP 4.3 ist es nun aber auch möglich die gebräuchliche und kompaktere Adressierung innerhalb eines Strings zu verwenden:

fsockopen('127.0.0.1:80)

Hier wird, wie üblich, die Portnummer mit Hilfe eines Doppelpunktes von der IP-Adresse getrennt. Intern werden dann die IP-Adresse (127.0.0.1) und die Portnummer (80) extrahiert und eine entsprechende Netzwerkverbindung aufgebaut. Die Frage ist nun, was geschieht, wenn »fsockopen()« mit folgenden Argumenten aufgerufen wird:

fsockopen('127.0.0.1:80', 443)

Soll nun eine Verbidung zu Port 80 oder 443 aufgebaut werden? Das sollte zu einer Fehlermeldung führen, weil die Portnummer hier unzulässigerweise doppelt angegeben ist.   Stattdessen geschieht bei einem solchen Aufruf Folgendes: der Gesamtstring wird so zusammengesetzt: »127.0.0.1:80:443«. Dann wird der Parser von PHP darauf angewendet und dieser ignoriert dann den extra angegebenen Port. Ein Angreifer kann diese Schwachstelle ausnutzten, um auf verschiedene Portnummer zuzugreifen. Besonders im Zusammenhang mit Firewalls und entsprechend geschützten Ports kann dies zu Sicherheitslücken führen.

comments powered by Disqus

Ausgabe 06/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.