PHPSESSID: Problem mit php Session ID (Sicherheitslücke durch Link-Login?)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHPSESSID: Problem mit php Session ID (Sicherheitslücke durch Link-Login?)

    Hi zusammen,

    Ich arbeite gerade an einem Community Login und bin am verzweifeln, weil ich ein ganz erhebliches Sicherheitsproblem entdeckt habe.

    Dass php-seitig gewöhnlich beim ersten Besuch der Page dieser &PHPSESSID-Parameter an die URL angehängt wird, ist die eine Sache. Allerdings wird genau dieser Paramter bei mir zu einem ernsthaften Sicherheitsproblem.

    Loggt sich ein User mittels Auto-Login ein, dann ist darauffolgend bei allen Links dieses Session ID angeben. Klickt ein User darauf, dann wird diese Session-ID logischerweiße auch in der Adressleiste angezeigt, z.B:

    www.domain.de/?cmd=news&sid=abf42342cd022

    ABER: Wird dieser Link beispielsweise von dem eingeloggten User in ein Forum gepostet, und ein externer Dritter greift auf diesen Link mit dieser Session ID zu, dann wird er automatisch als eben genau dieser Benutzer eingeloggt.

    Ich könnte verzweifeln. Ich weiß nicht was ich dagegen unternehmen soll. Ich hab auch schon probiert mittels ...

    PHP-Code:
    ini_set("session.use_only_cookies""1");
    ini_set("session.use_trans_sid ""0"); 
    ... die Ausgabe dieser Session IDs komplett zu verhindern, doch so wie es scheint machen sich diese Änderungen leider nicht bemerkbar. Die Session ID wird dennoch an die Links angehängt.

    Wie entgegne ich aber dem eigentlichen Problem? Ein Link, in dem eine Session ID angegeben ist, soll nicht automatisch das Hintertrüchen sein, mit dem sich dann sämtliche nicht registriete Benutzer einloggen können.
    Wie lösen dieses Problem z.B. Foren wie dieses oder das phpBB? Dort werden ja auch gelegentlich die &sids angehängt, aber zu Sicherheitsproblemen kommt es dort ja glücklicherweiße nicht.

    Für jeglichen noch so kleinen Tipp bin ich echt dankbar und wünsche allen Usern des Forums ein frohes Weihnachtsfest.
    Grüße, Chrissi
    Our Dreams are Wings

  • #2
    Das ist ein generelles Problem von Sessions. Cookies kannst du theoretisch genau so "stehlen".

    Binde die Session an eine IP. Sprich: Speicher die IP mit der die Session gestartet wurde in die Session und gleiche bei jedem Seitenaufruf die IP der Anfrage mit der in der Session gespeicherter IP ab. Wenn die IPs ungleich sind kannst du einfach ein session_destroy() machen.
    Bedenke, dass die Session dann auch abläuft wenn sich die IP des Users ändert. Der muss sich dann also einmal neu einloggen.

    Das mal ganz generell. Die SID aus der URL zu entfernen ist aber zusätzlich auch nicht so verkehrt. Da müsste ich jetzt aber auch gerade googlen.

    Kommentar


    • #3
      Du kannst das eigentlich nicht verhindern, wenn es aus Absicht geschieht, ausser wie gesagt die Session an die IP zu binden und das lohnt sich nicht und ist ausserdem zu aufwendig.

      Du solltest wie du bereits selbst vorgeschlagen hast Cookies benutzen, denn dann passiert es wenigstens nicht mehr aus versehen. Die Sessions kannst du ja auch noch zeitlich etwas stärker begrenzen, damm spööte doe Socjerjeit wohl ausreichend sein.

      Kommentar


      • #4
        Und was manchen dann die ganzen armen AOL Surfer? Die haben bei fast jedem Zugriff 'ne andere IP.

        Den Cookie kann man zumindest nicht so einfach stehlen. Zumindest nicht indem man eine Seite verlinkt.
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          Hi,

          Danke euch soweit für die Informationen.

          Dieser Datenbankvergleichscheck ist für mich mehr eine Notfall-Lösung. Einerseits ist es wieder eine Datenbankanfrage mehr, und wenn ich recht überlege ist dann auch kein Auto-Login mehr möglich... vermutlich ...

          in den php.net comments bin ich gerade über folgenden Eintrag gestoplert:

          Try this code snippet, from a book by a security expert who says this is more secure to place on every page:

          PHP-Code:
          <?php 
          session_start
          (); 
          $_SESSION['name'] = "YourSession"

          if (!isset(
          $_SESSION['initiated'])) 

              
          session_regenerate_id(); 
              
          $_SESSION['initiated'] = true

          ?>
          Ich hab das gerade intensiv getestet und muss sagen, dass es eigentlich keinen Wert hat - zumindest für meinen Zweck.
          Sobald eine $_GET['sid']-Session-ID in der URL übergeben wurde, dann wurden mit ihr versteckt auch sämtliche anderen Session Variablen, die zu dieser Session gehören ebenfalls angelegt. So auch das $_SESSION['initiated'].

          Gibt es wirklich nur den Datenbankvergleichscheck und nicht noch eine andere Methode? Ich meine, dass man doch anders auch lösen könnte, oder?

          EDIT: Weil noch mal die Sache mit den Cookies angesprochen wurde: Ich arbeite schon mit Cookies, allerdings nur zum Speichern der Autologin Funktion. Meint ihr, dass ich den Username, etc. erst gar nicht in einer Session speichern soll (z.B. $_SESSION['username'], $_SESSION['user_id']), sondern diese Werte alle direkt im Cookie ablege?
          Das würde aber doch bedeuten, dass ich insgesamt in der gesamten Onlineplattform keine einzige $_SESSION-Variable benutzen dürfte, oder?
          Zuletzt geändert von Chrissi007; 23.12.2008, 17:58.
          Grüße, Chrissi
          Our Dreams are Wings

          Kommentar


          • #6
            session.use_trans_sid abschalten dürfte das einfachste sein.
            Ansonsten evtl. hier mal nachlesen: http://phpforum.de/forum/showthread.php?t=216531
            Wir werden alle sterben

            Kommentar


            • #7
              Wenn du willst, dass es möglich ist, dass der User eingeloggt bleibt (über längere Zeit) ist das bei Webbrowsern mit HTML-PHP nur mit Cookies oder der URL möglich und die URL wäre zu umständlich.
              Das Cookie könnte dann aber auch von allen geklaut werden.
              Das würde aber bedeuten, dass jemand Zugriff zum PC mit dem Cookie haben müsste.
              Wenn du diese Funktion bereit stellen willst, dann wird dieses Problem so oder so bestehen.

              Ich empfehle dir aber nicht alle diese Userdaten lokal zu speichern, denn da können sie leicht verändert werden. Die GET-Daten zu bearbeiten ist beinahe gleich einfach wie die Cookie-Daten.

              Wie gesagt in deinem Fall lohnt sich das mit der IP nicht und wie goth erwähnt hat wirst du damit eher User verärgern. Ausserdem was machst du wenn plötzlich einer die IP eines anderen Users hätte?... Nicht sehr wahscheinlich, aber es ist den Aufwand nicht wert da etwas mit PHP zu machen.

              Die Sessions in Cookies zu speichern wird sogar an weit heikleren Orten gemacht als bei deinem Beispiel. Z.B. bei e-Banking.

              Den Sinn dieses Snippets alleine sehe ich ehrlich gesagt nicht ein, denn die alte Session wird hier nicht einmal gelöscht. Wenn schon, dann müsstest du session_regenerate_id(true); verwenden und das mit $_SESSION['initiated'] weglassen, denn das macht keinen Sinn.
              Also einfach
              PHP-Code:
              session_start();
              session_regenerate_id(true); 

              Kommentar


              • #8
                Dauerlogin und Sessions sind 2 völlig verschiedene paar Schuh!
                Für beides sind allerdings Cookies die beste und wohl sicherste Wahl.
                Wir werden alle sterben

                Kommentar


                • #9
                  es gilt eben auch zu beachten,
                  daß der Schaden bei feindlicher Übernahme einer
                  Session gering gehalten wird.
                  So sollte das PW nicht in der Session gespeichert werdem
                  und grundlegende Änderungen des Accounts wie das
                  Ändern der Userdaten sollten mit einer erneuten PW-Eingabe
                  verbunden sein.

                  Kommentar


                  • #10
                    So sollte das PW nicht in der Session gespeichert werdem
                    Klar kannst du das, solltest es eben nur nirgendwo ausgeben

                    Kommentar


                    • #11
                      Warum das Passwort in Session speichern?
                      Sehe keinen Grund.

                      Ausser, du möchtest ein evtl installiertes RootKit
                      (oder Domainnachbar) mit wichtigen Informationen versorgen.


                      Zuletzt geändert von combie; 23.12.2008, 23:59.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Warum das Passwort in Session speichern?
                        Sehe keinen Grund.
                        Das wäre natürlich die zweite Frage Aber ich meine sensible Daten generell. Ob nun in der Session oder der Datenbank, ich sehe da kein Problem, solange du sie halt nirgends ausgibst, dann kommt auch kein Schuft dran.

                        Kommentar


                        • #13
                          Hmmm...
                          Tut weh, aber ich sags trotzdem:
                          Es gibt nur einen einzigen Grund ein Passwort zu speichern, "Um den User wieder zu erkennen."
                          Dann aber bitte in der DB oder in einer Datei mit allen anderen Usern. Und aber auch dann NUR als gesalzener Hashwert.
                          In Session ist das Passwort auf jeden Fall über...
                          In Session UND in der DB wäre redundant.

                          Aber andererseits hast du auch recht!
                          Man MUSS der DB und $_SESSION vertrauen können.
                          Sonst haben wir PHPler verloren.
                          Zuletzt geändert von combie; 24.12.2008, 01:05.
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            Es gibt nur einen einzigen Grund ein Passwort zu speichern, "Um den User wieder zu erkennen."
                            Dann aber bitte in der DB oder in einer Datei mit allen anderen Usern. Und aber auch dann NUR als gesalzener Hashwert.
                            Das ist mir klar. Darum gehts mir aber auch nicht.
                            Man MUSS der DB und $_SESSION vertrauen können.
                            Genau so ist es, darauf habe ich abgezielt.

                            Kommentar


                            • #15
                              Hi,

                              Vielen Dank und frohe Weihnachten allen! Ihr habt mir sehr weitergeholfen. Wenn ich noch mal was genaueres zu dem Thema habe meld ich mich. Klasse Community hier *lob*.
                              Grüße, Chrissi
                              Our Dreams are Wings

                              Kommentar

                              Lädt...
                              X