Https: IP-Wechsel-Hack

(Kommentare: 0)

Spezielles Spezialproblem: Ich betreibe eine Website (mit CMS Contao/Typolight), bei der die Seiten für Login etc. via https aufgerufen werden, andere Seiten normal via http.
Ich bin korrekt eingeloggt und klicke im Menü auf eine Seite, die mit http aufgerufen wird. Auf dieser Seite bin ich auf einmal ausgeloggt bzw. sind der User und der Login-Status offenbar nicht mehr in der Session gehalten.


Ursache: Aus Sicherheitsgründen speichert das CMS Contao (früher Typolight) für jede Session die IP-Adresse des Clients in der Datenbank. Bei jedem Request wird bzgl. des Login-Status geprüft, ob die IP-Adresse passt ($_SERVER["REMOTE_ADDR"], Klasse Frontend::getLoginStatus()). Dies soll Session-Übernahme durch Fremde (also von anderen Rechnern) verhindern.
In ganz speziellen Fällen kann das problematisch sein.
In meinem Fall hing mein Rechner in einem Firmennetz. In dieser Firma wurden Requests mit http und https auf unterschiedliche Leitungen und damit unterschiedliche Firewalls gelenkt, die somit jeweils eine andere IP-Adresse an den Server übermittelten. So hatte mein http-Request eine andere IP als mein https-Request, wenngleich sie selben Cookie und mithin den selben Session-Inhalt - außer eben den Login-Status.

Contao bietet die Möglichkeit, diesen IP-Check auszuschalten, generell oder in bestimmten Fällen. Generell auszuschalten öffnet natürlich dem Session-Hijacking Tür und Tor. Und irgendwie zwischen Check und Nicht-Check innerhalb der selben Session zu wechseln schien mir auch nicht das richtige. Also folgender kleiner Hack.

Mögliche Lösung: Die Datei system/config/initconfig.php wird während der Initialisierung (system/initialize.php) aufgerufen und ermöglicht hier bestimmte Eingriffe, bevor die Seitendarstellung angefangen wird. Hier prüfe ich den speziellen Fall ab und setze die REMOTE_ADDR, wenn die aktuelle Session mit https aufgerufen wurde und nun mit http, auf die https-IP. Das ist dreckig, aber eine (schnelle) Lösung, die geklappt hat.

if (!isset($_SESSION['remoteip']['http']) && !$_SERVER['HTTPS']) $_SESSION['remoteip']['http'] = $_SERVER["REMOTE_ADDR"];
if (!isset($_SESSION['remoteip']['https']) && $_SERVER['HTTPS']) $_SESSION['remoteip']['https'] = $_SERVER["REMOTE_ADDR"];
if ($_SERVER["REMOTE_ADDR"] == $_SESSION['remoteip']['http'] && isset($_SESSION['remoteip']['https'])) {
    $_SERVER["REMOTE_ADDR"] = $_SESSION['remoteip']['https'];
} 

Das ändert für normale Fälle nichts, wo Requests immer mit derselben IP ankommen.


Interessante Webseiten zum Thema Session


Session Sicherheit (PHP Sessionverwaltung und Angriffe, Session-Übernahme und Maßnahmen dagegen): phpforum.de

Session Fixation: de.wikipedia.org

PHP/Einführung in die Sitzungsverwaltung: "Auch die IP-Nummer ist nicht geeignet, denn einige Internetdienstanbieter vergeben die IP-Numemr nicht nur beim Verbindungsaufbau dynamisch, sondern wechseln sie auch während der Sitzung." mikiwiki.org

Wechsel der IP-Adresse während einer Session (alt, von 2001): forum.de.selfhtml.org



Zurück

Kommentare

Einen Kommentar schreiben