$_Session Variable

boyben

Mitglied
Also ich programmiere eine größere Webaplikation. Diese ist auch eigentlich soweit fertig.
Heute habe ich die Seite dann mal etwas nach Schwachstellen durchsucht.
Und prompt stoße ich auf eine Lücke die mir irgendwie total seltsam vorkommt.
Es geht um das Login System, bevor ich die Seite ausgebe prüfe ich ob der Benutzer eingeloggt ist.
Falls dem nicht so ist gebe ich ein einfaches Formular aus.
HTML:
<form name="login" id="login" onsubmit="xajax_login(xajax.getFormValues('login'));return false;">
<table width="400" border="0" align="center" cellpadding="3" cellspacing="0" class="copytext">
  <tr>
    <td colspan="2"><div class="h1">
      <p align="left" class="h2">Bitte einloggen! </p>
    </div></td>
  </tr>
  <tr>
    <td width="50%" class="text1">Benutzername:</td>
    <td class="text1"><label>
      <input name="t_username" type="text" class="text1" id="t_username" />
      </label>
    </td>
  </tr>
  <tr>
    <td class="text1">Passwort:</td>
    <td class="text1"><label>
      <input name="t_passwort" type="password" class="text1" id="t_passwort" />
    </label></td>
  </tr>
  <tr>
    <td class="text1">Sprache:</td>
    <td class="text1"><label>
      <select name="select" disabled="disabled">
        <option value="1">Deutsch</option>
        <option value="2">Englisch</option>
      </select>
    </label></td>
  </tr>
  <tr>
    <td colspan="2"><input name="b_login" type="submit" class="text1" id="b_login" value="Senden" /></td>
  </tr>
</table>
</form>

Beim einloggen registriere ich die Session und setze eine $_Session Variable.

PHP:
$_SESSION['s_nr'] = $_POST['t_username']
Wobei der t_username eigentlich aus der Datenbank kommt.
Die Webapplikation wird nur ausgegeben wenn diese Variable registriert ist.

Nun mein Problem wenn ich mir die Session ID und die Registriere Session Variable ausgebe, in eine Url packe:

http://localhost/index.php?PHPSESSID=208d320d4b21ef3e2c9dbf2981f7eb5b&s_nr=58301

Gelange ich auch von anderen Rechner in genau dieselbe Session.
Ich prüfe explizit die Variable über das $_SESSION Array allerdings sollte doch bei so einem URL Konstrukt die Variable über $_GET kommen.

Ich steht irgendwie voll auf dem Schlauch und bin irgendwie auch etwas geschockt.
Ps.: register_globals steht definitiv auf off!

Bitte helft mir.
LG
Bebo
 
Jo, das ist ja schön und gut. Aber das ist ja auch nur ein Teilerfolg. Da sollte man nur mal ein Internetkaffe erwähnen und schon nutzt das alles nichts mehr.

Für was gibt es dann bitte die verschieden Variablen $_POST, $_GET, $_SESSION usw. wenn ich die trotzdem über ne einfache URL überschreiben kann?
 
Du solltest einfach die Session ID nicht in der URL anzeigen lassen. Von alleine sieht der Benutzer sie nicht und kann somit auch keine Session übernehmen! Wenn du das Login verbessern willst dann mache das mit HTACCESS und PHP
 
Da wird nix überschrieben. Das Problem ist, dass die Session-ID in der URL übergeben wird, d.h. wenn du den Link an Freunde z.B. schickst, sind die automatisch mit eingeloggt. Das kann man u.a. verhindern, indem man session.use_trans_sid aktiviert.
PHP:
ini_set("session.use_trans_sid", true);

Oder du schreibst dir ein eigenes Session-Management und prüfst anhand weiterer Faktoren, ob die Session-ID dem Benutzer zugeordnet werden kann (Cookie, Browser, IP oder sowas. Da gab es schonmal ein Thread im Forum, musst mal suchen).
 
An die Url wird nichts angehängt die steht immer auf INDEX.PHP ich war das ja nur am testen.
Trotzdem könnte es jemandem durch nen BUG in PHP oder in meiner Seite gelingen an die SESSION ID und die registrierte Variable zu kommen.

Ich werd das morgen mal mit der INI Option ausprobieren.

Schomal danke für die Hilfe!

LG
Bebo
 
Ne wie denn? Ausser der "Hacker" ist auf dem selben System wie du und dein Anbieter hat ein globalen Speicherort für Sessions
 
Ich habe gerade nicht richtig verstanden warum nicht einfach die Session-Variable meinetwegen per _Post übertragen werden kann. Somit steht Sie nicht in der Url sondern im Header.
Weiterhin wäre ja möglich die Sessions auf dem Server zu speichern und meinet wegen per IP und/oder Cookie den Nutzer zu identifizieren.
 
Die ganze Zeit baut auf xajax auf somit werden keine Variablen in der Url angezeigt.
Es ging mir nur darum mal die Sicherheit zu testen.
Deshalb hab ich mir aus Spaß die Session Id auf der Webseite selber ausgeben lassen diese dann in die Url kopiert und auf nem anderen Rechner aufgerufen und schwups war ich in genau der selben Session drin ....

Die oben gennante INI Direktive verändert nichts. Werde wohl nich drum drum kommen irgendwas mit cookies zu machen!
LG
Bebo
 
Du kannst doch separat auf $_SESSION, $_GET und $_POST zugreifen - sollte doch dann kein Ding des Unmöglichen sein die Session-ID nur per POST zu akzeptieren...
session_id() mit $_GET und $_POST abgleichen - wenn in $_GET vorhanden -> die() :)
Versteh sonst nich wo dein Problem liegt...
Ein großer böser Hacker kann auch ne POST-Anfrage manipuliern, um dich gegen Session Injection abzusichen hilft nur IP und Browserkennung zu loggen und dann zu vergleichen, ums noch etwas schwerer zu gestalten noch ne Art Auth-Cookie mit nem md5-hash drin o.Ä., aber 100% sicher wird das wohl nie sein.
MfG
 
Zurück