Uwe: Session-ID "klauen"

Guten Abend

ich frage mich, welche Möglichkeiten es gibt, Session-IDs zu "klauen".
Ist es z.B. durch Einbinden eines Links auf einen oder eines Bildes von einem anderen Server (z.B. über ein Gästebuch, das HTML erlaubt) innerhalb eines internen Bereichs möglich, die Session-ID auszulesen? Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?
Wenn ja, kann das Auslesen der Session-ID durch die Einstellung, dass Session-IDs nur in Cookies und nicht in URLs übergeben werden, verhindert werden?

Welche anderen Gefahren bringt das Einbinden von Links und Bildern mit sich?

Grüße, Uwe.

  1. n'Ahmd Uwe,

    ich frage mich, welche Möglichkeiten es gibt, Session-IDs zu "klauen".

    Im Sinne von Session_Cookies:

    Klau ist nur Möglich wenn

    • cookie auf PC, der eine Session hat, ausgelesen und mündlich oder schriftlich oder in einer anderen Form weitergegeben werden kann,

    • ein Netzwerkanalyzer (sniffer, tcpdump, ethereal) in der Collision-Domain des PCs angeschlossen werden kann (in einer ge-switchten Umgebung praktisch nicht möglich),

    • der Programmierer einen session-key verwendet, der leicht erraten werden kann (i.e.: UNIX-Timestamp).

    --roro

  2. ich frage mich, welche Möglichkeiten es gibt, Session-IDs zu "klauen".

    Erraten oder erschnüffeln, wenn kein SSL zum Einsatz gekommen ist. (Angeblich kann auch SSL mangels ausreichender Schlüssellänge geknackt werden (von entsprechend geschulten Diensten ;).)

    Ist es z.B. durch Einbinden eines Links auf einen oder eines Bildes von einem anderen Server (z.B. über ein Gästebuch, das HTML erlaubt) innerhalb eines internen Bereichs möglich, die Session-ID auszulesen?

    Was ist denn die SessionID? Sie ist eine Eindeutigkeit (eine Kennung), die vom Server vergeben wird und dann "roundtripped". Wenn Du die an andere weiterleiten möchtest und Deine serverseitige Logik dementsprechend anpasst, dann geht das natürlich, aber Sinn machts nur unter ganz bestimmten Bedingungen. Aber Du musst keine Angst haben, dass das bspw. PHP oder Perl "für Dich" machen, das uist nicht der Fall.

    Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?

    Nöö.

    Welche anderen Gefahren bringt das Einbinden von Links und Bildern mit sich?

    Keine.

    1. King Lully ist schlecht informiert.

      ich frage mich, welche Möglichkeiten es gibt, Session-IDs zu "klauen".

      Erraten oder erschnüffeln, wenn kein SSL zum Einsatz gekommen ist.

      Das sind nicht die einzigen Methoden.

      Ist es z.B. durch Einbinden eines Links auf einen oder eines Bildes von einem anderen Server (z.B. über ein Gästebuch, das HTML erlaubt) innerhalb eines internen Bereichs möglich, die Session-ID auszulesen?

      Wenn die Session-ID in der URL übertragen wird: Ja.

      Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?

      Nöö.

      Ja - wenn die Session-ID in der URL übertragen wird.

      Welche anderen Gefahren bringt das Einbinden von Links und Bildern mit sich?

      Keine.

      Jede Menge, die noch weit über die Verschleppung der Session-ID hinausgehen.

      1. Ja - wenn die Session-ID in der URL übertragen wird.

        Wird denn die Session-ID unter PHP (wenn das automatische Anhängen dieser an Links auf der Seite aktiviert ist) in der URL übertragen? Oder wird die Session-ID bei externen Links automatisch nicht angehängt?
        Wie ist es bei Bildern, erscheint in den Access-Logs die Session-ID in der Referer-URL?

        Jede Menge, die noch weit über die Verschleppung der Session-ID hinausgehen.

        Kannst du mir die wesentlichsten davon nennen?

        Grüße, Uwe.

        1. Ja - wenn die Session-ID in der URL übertragen wird.

          Wird denn die Session-ID unter PHP (wenn das automatische Anhängen dieser an Links auf der Seite aktiviert ist) in der URL übertragen? Oder wird die Session-ID bei externen Links automatisch nicht angehängt?

          Wenn die Session-ID in der URL steht, taucht die ID überall dort auf, wo die URL dieser Seite auftaucht. Auf externen Servern also als Referrer in den Logs.

          Wie ist es bei Bildern, erscheint in den Access-Logs die Session-ID in der Referer-URL?

          Aber klar doch.

          Jede Menge, die noch weit über die Verschleppung der Session-ID hinausgehen.

          Kannst du mir die wesentlichsten davon nennen?

          Es gibt sicherlich viele Szenarien, die aber alle abhängen von der Art der Möglichkeiten, die man anbietet.

          Das einbinden von Bildern auf externen Servern generiert üblicherweise dort "nur" Referrer. Bei Browsern mit angreifbarer Bildimplementation aber öffnet sich eine riesige Sicherheitslücke, über die möglicherweise weitere Daten ausspioniert werden können. Oder man macht es so wie der IE, der auch Javascript, was unter einer Bild-URL als Bild mit <img> eingebunden wird, ausführt - schon hat man wohlmöglich das schönste Cross Site Scripting.

          Im Grunde genommen kannst du dir alle Detailproblembetrachtungen schenken, wenn du einen pessimistischen Ansatz wählst: Willst du als Seitenanbieter die Verantwortung für beliebigen, im Internet angebotenen Content übernehmen? Dann erlaube die aktive Einbindung von Bildern und/oder Links, und kontrolliere regelmäßig mit einem vernünftig eingestellten, topaktuellen Browser.

          Andernfalls erlaube keinerlei Einbindung von Bildern, Links und Skripten.

          1. Wenn die Session-ID in der URL steht, taucht die ID überall dort auf, wo die URL dieser Seite auftaucht. Auf externen Servern also als Referrer in den Logs.

            Ich habe die Stelle auf der PHP-Seite wiedergefunden, an der ich mal darüber gelesen hatte: http://de3.php.net/manual/de/ref.session.php#session.idpassing
            Dort steht doch:
            "Anmerkung:  Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe Seiten zeigen und deshalb keine SID angehängt, weil es ein Sicherheitsrisiko wäre, die SID an einen anderen Server zu übermitteln."

            Also sind externe Links doch keine Gefahr!?

            Wie ist es bei Bildern, erscheint in den Access-Logs die Session-ID in der Referer-URL?

            Aber klar doch.

            Wird nicht auch dort die SID automatisch gestrichen?

            Danke auch für die weiteren Hinweise von dir!

            Grüße, Uwe.

            1. Ich habe die Stelle auf der PHP-Seite wiedergefunden, an der ich mal darüber gelesen hatte: http://de3.php.net/manual/de/ref.session.php#session.idpassing
              Dort steht doch:
              "Anmerkung:  Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe Seiten zeigen und deshalb keine SID angehängt, weil es ein Sicherheitsrisiko wäre, die SID an einen anderen Server zu übermitteln."

              Also sind externe Links doch keine Gefahr!?

              Das kann man so nicht grundsätzlich sagen.

              Dein Zitat bezieht sich auf das Feature "session_trans_sid", also dem automatischen Anhängen der Session-ID an Links, wenn PHP noch kein Session-Cookie festgestellt hat (das ist mindestens beim ersten Request der Fall).

              PHP hängt nicht blind an alle Links die Session-ID dran, sondern nur an Links, die es als "lokal" betrachtet. Auf diese Weise wird tatsächlich vermieden, dass die Session-ID über die aufgerufene URL auf Drittserver gelangt.

              Aber auf den Referrer wirkt der Mechanismus nicht! Wenn also zu irgendeiner Zeit eine Seite mit Session-ID in der URL im Browser geladen ist, wird jeder Link auf externe Server diese Session-ID im Referrer an fremde Server senden - sofern der Browserbenutzer das nicht individuell bei sich unterbunden hat, worauf man sich aber nicht verlassen sollte.

              Wie ist es bei Bildern, erscheint in den Access-Logs die Session-ID in der Referer-URL?

              Aber klar doch.

              Wird nicht auch dort die SID automatisch gestrichen?

              Nein, warum denn?

              Nur der Browser ist für die Erzeugung der Referrer-Angabe verantwortlich. Der Browser weiß nichts von PHP, und es ist auch unzumutbar, den Browserherstellern aufzudrücken, doch bitteschön die Session-ID von PHP rauszufiltern. Das ist nämlich ein Ding der Unmöglichkeit aus zwei Gründen:
              1. Der Parametername ist nicht fest "PHPSESSID", sondern kann frei gewählt werden. Siehe http://www.php.net/session-name
              2. Die eigentliche Session-ID ist nicht fest, sondern kann frei gewählt werden (PHP macht hinsichtlich der erlaubten Zeichen Einschränkungen, aber Form und Länge sind beliebig). Siehe http://www.php.net/session-id.

              Daraus folgt: Es gibt keine Möglichkeit, einen allgemeinen URL-Parameter-Filter zu programmieren, weil potentiell jeder Parameter eine Session-ID sein könnte. Von dem nicht so unwahrscheinlichen Fall, dass die Session-ID sich im Pfadnamen befindet, mal abgesehen.

      2. King Lully ist schlecht informiert.

        Das lesen wir aber ungerne. Aber, wenns stimmt...

        ich frage mich, welche Möglichkeiten es gibt, Session-IDs zu "klauen".

        Erraten oder erschnüffeln, wenn kein SSL zum Einsatz gekommen ist.

        Das sind nicht die einzigen Methoden.

        Welche denn noch?

        Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?

        Nöö.

        Ja - wenn die Session-ID in der URL übertragen wird.

        Moment, das ist ja wohl browserabhängig. Kann da mal differentiert werden?

        Welche anderen Gefahren bringt das Einbinden von Links und Bildern mit sich?

        Keine.

        Jede Menge, die noch weit über die Verschleppung der Session-ID hinausgehen.

        "Jede Menge"? Wohl eher wieder die Referer-Problematik.

        1. hi,

          Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?

          Nöö.

          Ja - wenn die Session-ID in der URL übertragen wird.

          Moment, das ist ja wohl browserabhängig. Kann da mal differentiert werden?

          Ja, kannst du gerne - wenn du einen Browser nennen kannst, bei dem du bei ganz normal eingestellter Referrer-Übermittlung beobachtet hast, dass dieser sich beim Betätigen von Links, die eine Session-ID enthalten, anders verhält als bei Links ohne - dann mach das bitte.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Anders gefragt: Wird in den Access-Logs des "anderen Servers" die Session-ID unter dem Referer-Eintrag sichtbar?

            Nöö.

            Ja - wenn die Session-ID in der URL übertragen wird.

            Moment, das ist ja wohl browserabhängig. Kann da mal differentiert werden?

            Ja, kannst du gerne - wenn du einen Browser nennen kannst, bei dem du bei ganz normal eingestellter Referrer-Übermittlung beobachtet hast, dass dieser sich beim Betätigen von Links, die eine Session-ID enthalten, anders verhält als bei Links ohne - dann mach das bitte.

            Wir wiederholen die Thematik noch einmal:
            Beim Einbinden externen Ressourcen (Bildchen z.B. - so die Fragestellung) werden "lokale" Session-IDs an den Ressourcenanbieter übertragen?

            ("dass dieser sich beim Betätigen von Links, die eine Session-ID enthalten, anders verhält als bei Links ohne" haben wir nicht verstanden.)

            1. hi,

              Wir wiederholen die Thematik noch einmal:
              Beim Einbinden externen Ressourcen (Bildchen z.B. - so die Fragestellung) werden "lokale" Session-IDs an den Ressourcenanbieter übertragen?

              Es wird, so der Benutzer dies nicht unterbunden hat, der Referrer übertragen.

              Wisst Ihr über den Referrer bescheid (was man darunter versteht, was dabei übermittelt wird)?
              ( ) Ja
              ( ) Nein

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Wisst Ihr über den Referrer bescheid (was man darunter versteht, was dabei übermittelt wird)?
                ( ) Ja
                ( ) Nein

                [x] ja

                Wir sind nur überrascht, dass der einfach so komplett (also inkl. Parametriesierung) übertragen wird von den lieben netten Browsern.

                1. hi,

                  Wisst Ihr über den Referrer bescheid (was man darunter versteht, was dabei übermittelt wird)?
                  [x] ja

                  Wir sind nur überrascht, dass der einfach so komplett (also inkl. Parametriesierung) übertragen wird von den lieben netten Browsern.

                  Wenn sich die Parameter im Querystring zweier URLs unterscheiden, handelt es sich um zwei verschiedene Ressourcen - welchen Grund sollte es also geben, diese nicht mit zu übermitteln?

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Wir sind nur überrascht, dass der einfach so komplett (also inkl. Parametriesierung) übertragen wird von den lieben netten Browsern.

                    Wenn sich die Parameter im Querystring zweier URLs unterscheiden, handelt es sich um zwei verschiedene Ressourcen - welchen Grund sollte es also geben, diese nicht mit zu übermitteln?

                    Unterschiedliche Parametriesierung kann ein und dieselbe Ressource bedeuten. Aber mal davon abgesehen, scheinen sich also ggf. SessionIDs per POST und Einbindung externer Ressourcen aus Sicherheitsgründen auszuschliessen. Finden wir nicht so toll. Die Referrer-Angaben scheinen uns eher unwichtig. Warum gibts die?

                    1. hi,

                      Wenn sich die Parameter im Querystring zweier URLs unterscheiden, handelt es sich um zwei verschiedene Ressourcen - welchen Grund sollte es also geben, diese nicht mit zu übermitteln?

                      Unterschiedliche Parametriesierung kann ein und dieselbe Ressource bedeuten.

                      Nein, kann sie nicht.
                      Unterschiedliche URLs = unterschiedliche Ressourcen

                      Sie können vielleicht die gleichen Inhalte liefern - ein Fall, in dem m.E. der Seitenersteller Murks gebaut hat.

                      Aber mal davon abgesehen, scheinen sich also ggf. SessionIDs per POST und Einbindung externer Ressourcen aus Sicherheitsgründen auszuschliessen.

                      Per GET meinst du.

                      Finden wir nicht so toll.

                      Tja, das Leben ist nun mal kein Ponyhof.

                      Die Referrer-Angaben scheinen uns eher unwichtig. Warum gibts die?

                      Um darin die Information zu übertragen, von welcher Seite der Nutzer einem Link gefolgt ist.

                      gruß,
                      wahsaga

                      --
                      /voodoo.css:
                      #GeorgeWBush { position:absolute; bottom:-6ft; }
                      1. Per GET meinst du.

                        Klar meinen wir das.

                        Die Referrer-Angaben scheinen uns eher unwichtig. Warum gibts die?

                        Um darin die Information zu übertragen, von welcher Seite der Nutzer einem Link gefolgt ist.

                        Wem nützt das? (Bei Webverweisen _vielleicht_ noch OK, aber bei Bildchen?) Scheint uns wenig sinnvoll.

                        1. hi,

                          Um darin die Information zu übertragen, von welcher Seite der Nutzer einem Link gefolgt ist.

                          Wem nützt das? (Bei Webverweisen _vielleicht_ noch OK, aber bei Bildchen?) Scheint uns wenig sinnvoll.

                          Links auf Webseiten, oder eingebundene Bilder - sind aus Sicht von HTTP auch alles nur Resourcen. Wozu da eine Unterscheidung machen?

                          gruß,
                          wahsaga

                          --
                          /voodoo.css:
                          #GeorgeWBush { position:absolute; bottom:-6ft; }
                          1. Links auf Webseiten, oder eingebundene Bilder - sind aus Sicht von HTTP auch alles nur Resourcen. Wozu da eine Unterscheidung machen?

                            Gut allerletzte Frage: Warum übertragen die Browser (anscheinend default-mässig) den Referrer? (OK, LOL, RFC und so, aber welchen Sinn machts?)