Kostja: Sessionübernahme

Hallo,

ich habe ein etwas größeres Problem:

Ich habe ein kleines Loginscript. Lief alles wunderbar. Jetzt kommt es allerdings vermehrt dazu, dass User auf einmal mitten beim Surfen das Profil wechseln und somit Zugang auf Mails der anderen User haben und das Profil löschen können.

Hier die wichtigen Funktionen:

  
function logged_in()  
{     $sql="SELECT id  
    FROM user  
    WHERE session='".session_id()."'  
    LIMIT 1";  
    $result= mysql_query($sql);  
      return ( mysql_num_rows($result)==1);  
}  
function login($userid)  
{     $sql="UPDATE user  
    SET session='".session_id()."'  
    WHERE id=".$userid;  
     mysql_query($sql);  
}  
  
if(logged_in() AND $_SESSION['IP']==$_SERVER['REMOTE_ADDR']) $log="1";  

Wenn die Variable log 1 ist wird der geschütze Bereich angezeigt.

Wie ist das möglich, dass die Session übernommen wird?
Wovon kommt das? Ich kann mir das nicht erklären...

  1. echo $begrüßung;

    function login($userid)
    {     $sql="UPDATE user
        SET session='".session_id()."'
        WHERE id=".$userid;
         mysql_query($sql);
    }

    Wo kommt denn der Inhalt von $userid her? Kann den der Benutzer eingeben/ändern? Kann man da vielleicht ungestraft »1 OR 1« übergeben?

    if(logged_in() AND $_SESSION['IP']==$_SERVER['REMOTE_ADDR']) $log="1";

    Welchen Inhalt hat den $log, wenn die Bedingungen nicht zutreffen? Ist es vielleicht möglich, dass PHP eine Variable namens $log aufgrund eines vom Benutzer mitgesendeten GET-Parameters anlegt, weil register_globals eingeschaltet ist?

    Wieso verwendest du die IP als Identifikationsmerkmal? Diese muss aufgrund von Proxy-Verwendung für ein und den selben User im Zeitraum der Session nicht unbedingt immer die selbe sein.

    Wie ist das möglich, dass die Session übernommen wird?
    Wovon kommt das? Ich kann mir das nicht erklären...

    Ergab die Analyse des Server-Logfiles im in Frage kommenden Zeitraum einer dieser Übernahmen etwas Interessantes?

    echo "$verabschiedung $name";

    1. Welchen Inhalt hat den $log, wenn die Bedingungen nicht zutreffen? Ist es vielleicht möglich, dass PHP eine Variable namens $log aufgrund eines vom Benutzer mitgesendeten GET-Parameters anlegt, weil register_globals eingeschaltet ist?

      Log wird davor auf "0" gesetzt. Also wenn es nicht zutrifft ist es "0".

      Wieso verwendest du die IP als Identifikationsmerkmal? Diese muss aufgrund von Proxy-Verwendung für ein und den selben User im Zeitraum der Session nicht unbedingt immer die selbe sein.

      Die Ip wird beim Login als Sessionvariable gespeichert und immer wieder mit der eigenen verglichen. Hatte ich gelesen, dass es helfen soll.

      Ergab die Analyse des Server-Logfiles im in Frage kommenden Zeitraum einer dieser Übernahmen etwas Interessantes?

      Darauf habe ich leider noch keinen Zugriff.

      echo "$verabschiedung $name";

      1. Hallo

        Wieso verwendest du die IP als Identifikationsmerkmal? Diese muss aufgrund von Proxy-Verwendung für ein und den selben User im Zeitraum der Session nicht unbedingt immer die selbe sein.

        Die Ip wird beim Login als Sessionvariable gespeichert und immer wieder mit der eigenen verglichen. Hatte ich gelesen, dass es helfen soll.

        Für z.B. AOL-Nutzer ist deine Lösung somit unbrauchbar. Selbige werden über Proxies auf das Internet losgelassen. Innerhalb einer Sitzung auch über verschiedene Proxies, womit diese Nutzer von einem Seitenaufruf zum nächsten durchaus mit verschiedenen IPs unterwegs sein können. Dein Skript schmeißt sie raus, obwohl sie immernoch, wenn auch mit anderer IP, sie selbst sind.

        Ergab die Analyse des Server-Logfiles im in Frage kommenden Zeitraum einer dieser Übernahmen etwas Interessantes?

        Darauf habe ich leider noch keinen Zugriff.

        Frag mal deinen Hoster.

        Tschö, Auge

        --
        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
        (Victor Hugo)
        Veranstaltungsdatenbank Vdb 0.1
        1. Für z.B. AOL-Nutzer ist deine Lösung somit unbrauchbar. Selbige werden über Proxies auf das Internet losgelassen. Innerhalb einer Sitzung auch über verschiedene Proxies, womit diese Nutzer von einem Seitenaufruf zum nächsten durchaus mit verschiedenen IPs unterwegs sein können. Dein Skript schmeißt sie raus, obwohl sie immernoch, wenn auch mit anderer IP, sie selbst sind.

          Ich habe den Vergleich der IPs rausgenommen. Mein Problem mit der Sessionübernahme habe ich aber immer noch nicht gelöst...