2009-09-08 19 views
6

Poiché ogni utente ha un PHPSESSID univoco, è possibile per due utenti, ad esempio per inserire informazioni nei dati SESSION di b utilizzando PHP standard in esecuzione sul server.Iniettare PHP in un'altra sessione utente

Nota, non lo sto utilizzando per scopi errati. Cercando di usarlo per chattare senza accesso al DB.

Grazie per il vostro tempo.

risposta

6

sto assumendo che si desidera avere in qualche modo una chat per B con l'invio di un messaggio che viene inserito nella sessione di esplorazione B.

Prima di tutto, A ha bisogno di imparare l'ID di sessione di B, forse selezionando il loro nome da un elenco. Quasi certamente vorrai crittografare questi ID di sessione, altrimenti hai creato un bel buco di sicurezza!

Quindi, Un invia i dati al server contenente l'ID di sessione di destinazione e un messaggio. Ecco come potremmo temporanei ID di sessione interruttore a scrivere che i dati nella sessione di destinazione:

//get data from form - I'll leave the encryption of the target 
//session id up to you! 
$target_session_id=decryptSessionId($_POST['target']); 
$message=strip_tags($_POST['message']); 

//remember our "real" session id and close the session 
$original_session_id=session_id(); 
session_write_close(); 

//open the target session 
session_id($target_session_id); 
session_start(); 

//add message to target session 
$_SESSION['chat'][]=$message; 

//close target session 
session_write_close(); 


//reopen the "real" session 
session_id($original_session_id); 
session_start(); 
2

leggere su session fixation

+0

Non penso che l'OP chieda di attacchi di sessione, ma di più su come scrivere codice che può aggiornare un'altra sessione. –

0

non posso dire per certo, ma dal momento che i dati della sessione è di default memorizzato in un file, se la vostra applicazione conosce l'ID di sessione dell'altro utente si potrebbe sostituire nel file sessione che è stato scritto dalle funzioni di sessione standard con dati modificati. La volta successiva che l'altro utente accede a uno script, i dati della sessione alterati verranno caricati.

Ma stai rischiando tutti i tipi di condizioni di gara e conflitti se lo fai solo in cima alla gestione della sessione integrata. Probabilmente vorrai sostituire le funzioni di gestione delle sessioni con le tue, in modo da poter affrontare tutti questi problemi. I problemi sono probabilmente molto più complessi di quanto non appaiano sulla superficie.

See: http://www.php.net/manual/en/session.customhandler.php per informazioni sui gestori di sessione personalizzati

0

gestore sessione predefinita di PHP utilizza solo l'ID di sessione per identificare la sessione. Ciò rende possibile utilizzare l'ID di sessione da un altro utente e quindi utilizzare la stessa sessione (Session Hijacking). Un altro attacco consiste nel preparare una sessione e indurre la vittima a utilizzare quella sessione in modo che la vittima e l'aggressore utilizzino nuovamente la stessa sessione (Session fixation).

La base di tali attacchi è che è sufficiente conoscere l'ID di sessione per utilizzare la sessione ad essa associata. Le tecniche di prevenzione devono utilizzare più informazioni di identificazione rispetto al solo ID di sessione. Alcuni suggeriscono di usare l'indirizzo IP (ma che può cambiare durante una sessione) o l'identificatore di user-agent. Un'altra tecnica consiste nel nascondere esternamente l'ID sessione, consentendo solo un cookie e HTTPS.

Ma essere anche a conoscenza dell'hosting condiviso. Alcuni potrebbero utilizzare un pool comune per tutti i file di dati di sessione di tutti i cumstomers.

1

La sessione è una cosa semplice che può essere facilmente reimplementata per fare ciò che desideri.Date un'occhiata a questo semplice exemple che ho scritto qualche tempo fa: http://pastebin.com/f3ca0ae8d

Usage:

  • new mySession(); fare lo stesso session_start();
  • $_MYSESSION fare lo stesso $_SESSION
  • delete mySession(); facendo lo stesso come session_write_close(); non è necessario utilizzare a meno che non si desideri rilasciare la sessione prima della fine dello script.

È possibile apportare alcuni adattamenti per utilizzarlo nel proprio scopo specifico, come definire l'ID sessione da soli in modo da poterlo condividere tra diversi utenti. Poiché $ _MYSESSION sarà comune tra gli utenti, puoi anche utilizzare regolarmente sessioni PHP insieme ad esso per memorizzare informazioni specifiche dell'utente in $ _SESSION.

[Edit]

http://pastebin.com/f3c31737e

Esempio: Inserire il canale di $ _SESSION [ 'channelId'] e stampare tutte le linee non letti.


session_start(); 
new mySession($_SESSION['channelid']); 

while (count($_MYSESSION['chat']) > 100) unset($_MYSESSION['chat'][key($_MYSESSION['chat'])]); 

while ($line = $_MYSESSION['chat'][$_SESSION['lastread']++]) 
     echo "$line
";

Esempio: parlare al canale.


session_start(); 
new mySession($_SESSION['channelid']); 

$_MYSESSION['chat'][] = $_SESSION['myname'] . ' says, "' . htmlspecialchars($_POST['message']) . '"'; 

ecc ...

1

Invece di scoreggiare in giro con quello che è, in sostanza, di file indiretta gestendo attraverso il sistema della sessione, perché non andare dritto al punto e utilizzare i file di testo?

È meno vulnerabile agli attacchi e anche meno volatile, nel senso che le future versioni di PHP potrebbero decidere di impedire questo tipo di cambio di sessione per motivi di sicurezza (completo ipotetico, ma ha senso).