Ich habe eine Frage zum Session-Hijacking in PHP. Ich habe heute Morgen darüber gelesen und habe ein paar Fragen, die in der Dokumentation, die ich gelesen habe, einfach nicht klar beantwortet wurden.
Kann ein Benutzer seine Sitzung auf meiner Website ändern? dh wenn sie beim Login eine Sitzung von X haben, können sie diese Sitzung auf Y oder Z ändern, wenn sie dies wünschen?
Ich dachte, dass Sitzungen vom Browser festgelegt wurden und nicht geändert werden konnten, aber all diese Sitzungs-Hijacking-Sachen, die ich gelesen habe, haben einige Zweifel in mir geweckt.
Der Begriff “Session” ist überladen, um auf dem Server und im Browser unterschiedliche Bedeutungen zu haben. Browsersitzungen sind bestenfalls schwach mit Serversitzungen verbunden. “Session Hijacking” bezieht sich auf Server Sitzungen.
Serverseitig hat eine Sitzung eine ID (die zwischen Client und Server weitergegeben wird), Inhalt (auf dem Server gespeichert) und möglicherweise andere Eigenschaften, wie z. B. die letzte Zugriffszeit. Die Session-ID wird in der Regel als Cookie übergeben. In PHP ist der Standardname für das Cookie „PHPSESSID“. Wenn keine Cookies verfügbar sind, verwendet PHP (optional) einen gleichnamigen Abfragezeichenfolgenparameter (“PHPSESSID”). Dieses Cookie (oder Abfrageparameter) kann leicht geändert werden und daher kann auch die Sitzungskennung geändert werden.
Die Inhalt einer Session (also den Anmeldestatus eines Benutzers enthalten) vom Client nicht geändert werden können, werden die Daten auf dem Server gespeichert und können nur durch ein PHP-Skript auf diesem Server geändert werden. Beachten Sie, dass in einer Shared-Hosting-Umgebung (gemeinsam von anderen Diensten oder Benutzern) die Sitzungen überschrieben werden können, wenn das standardmäßige Sitzungsspeicherverzeichnis verwendet wird (/tmp
). Um sich davor zu schützen, verwenden Sie entweder eine Datenbank durch session_set_save_handler()
oder legen Sie mithilfe von ein benutzerdefiniertes Sitzungsverzeichnis fest session.save_path
mit den richtigen Verzeichnisberechtigungen (vorzugsweise 700, was bedeutet, dass nur der Eigentümer (der PHP-Benutzer) darauf lesen und schreiben kann).
Um sich vor Session-Hijacking zu schützen, müssen Sie andere Möglichkeiten haben, den Benutzer für eine Sitzung zu identifizieren. Dies kann ein User-Agent, eine IP-Adresse oder ein anderes Cookie sein. Die zuvor genannten Methoden sind nur Problemumgehungen. Der beste Weg, sich vor dem Diebstahl des Sitzungscookies zu schützen, ist die Verwendung von HTTPS, wenn eine Sitzung beteiligt ist. Vergessen Sie nicht, die einzustellen httponly
Flagge zu true
verwenden session_set_cookie_params()
Clientseitig wird „Session“ wieder überladen und in verschiedenen Kontexten verwendet (z. B. Session-Manager, die beim Öffnen eines Browsers geöffnete Seiten wiederherstellen, Session-Cookies u sessionStorage
). Wir können versuchen, diese Bedeutungen zu kombinieren (was keineswegs eine Standardbedeutung ist), indem wir sagen, dass eine Browsersitzung aus einer Sammlung von Ansichten und den damit verbundenen Daten besteht. (Mit “Ansicht” meine ich ungefähr Registerkarten in Browsern mit Registerkarten und Fenster in Browsern ohne Registerkarten; die DOM window
Objekt macht eine Ansicht für JS verfügbar.) Jede Ansicht hat einen Verlauf, eine aktuelle Seite und Seitendaten. Seitendaten für Seiten in derselben Domäne werden zwischen Ansichten in einer Sitzung geteilt; Wenn sich zwei Seiten in unterschiedlichen Domänen oder Sitzungen befinden, teilen sie keine Daten. Das Beenden des Browsers schließt alle geöffneten Sitzungen und speichert möglicherweise einen Teil der Sitzung(en) (z. B. Verlauf, aktuelle Seiten, sessionStorage
), damit ein Sitzungsmanager sie erneut öffnen kann. Sitzungscookies sind Cookies, die verworfen werden, wenn eine Sitzung geschlossen wird; Mit anderen Worten, Session-Cookies sind nicht dauerhaft. Obwohl ein Sitzungscookie eine Sitzungs-ID enthalten kann, sind die beiden Konzepte senkrecht (Sinn 4; Sitzungscookies können andere Dinge als Sitzungs-IDs enthalten, und Sitzungs-IDs können in dauerhaften Cookies gespeichert werden).
Ob sich zwei unterschiedliche Ansichten in derselben Sammlung befinden, hängt vom Browser ab. Beispielsweise kann ein Browser davon ausgehen, dass eine Sitzung aus allen Registerkarten in einem einzigen Fenster besteht; separate Fenster sind separate Sitzungen. IE8 ermöglicht es Benutzern, neue Sitzungen über den Menüpunkt “Neue Sitzung” zu erstellen. Andernfalls werden in derselben Sitzung neue Fenster und Registerkarten geöffnet. Datenschutzmodi erstellen auch neue Sitzungen.
Zusammenfassend lässt sich sagen, dass Browsersitzungen tatsächlich vom Browser festgelegt werden, obwohl er Benutzern verschiedene Möglichkeiten zur Steuerung von Browsersitzungen bietet: Erstellen neuer Sitzungen, Ändern des Verlaufs und der aktuellen Seite in einer Ansicht durch Durchsuchen, Speichern und Wiederherstellen von Sitzungen. Ein Benutzer könnte sogar Sitzungsdaten ändern, indem er auf der Festplatte gespeicherte Sitzungen bearbeitet, obwohl dies keine Funktion des Browsers ist. All das hat nichts mit Session-Hijacking zu tun. Serversitzungen werden vom Server erstellt und verwaltet, aber Benutzer können Serversitzungen wechseln (versuchen), indem sie die Sitzungs-ID ändern, die ihr Browser an den Server zurückgibt, was die Grundlage für Sitzungs-Hijacking ist.
Siehe auch PHP-Sitzungsfixierung / Hijacking.
Ein Benutzer kann seine Sitzung jederzeit ändern. Es ist nur eine zufällige Zeichenfolge, die in einem Cookie im Browser des Benutzers gespeichert wird, und daher ist es für den Benutzer sehr einfach, sie zu ändern.
Da der eigentliche Inhalt der Sitzung auf Ihrem Server gespeichert wird, könnten Sie beispielsweise die IP-Adresse, den Benutzeragenten oder ähnliches des Benutzers speichern, um es schwieriger zu machen, Sitzungen voneinander zu stehlen, indem Sie überprüfen, ob diese Informationen bei jedem neuen http immer noch übereinstimmen Anfrage gestellt wird.
Kein tatsächlicher Benutzer kann den tatsächlichen Sitzungswert auf Ihrer Website ändern, aber er kann die Sitzungs-ID ändern, die verwendet wird, um die Sitzung zu verfolgen. Diese Sitzungs-ID wird im Client-Browser von Ihrer Website normalerweise mit dem Namen “PHPSESSID” in Cookies gespeichert, die auch als Sitzung bezeichnet werden Plätzchen. Wenn eine Sitzung auf einer Website gestartet wird, speichert sie die eindeutige ID, die dieser Sitzung entspricht, im jeweiligen Client-Browser in Form eines Cookies mit dem Namen “PHPSESSID”. Wenn der Benutzer also in der Lage ist, die PHPSESSID eines anderen Benutzers zu erhalten, und diese seine PHPSESSID durch die PHPSESSID des Opfers ersetzen kann, führt dies zu einer Sitzungsübernahme. Ich verwende hier den PHP-Kontext.