Modifica di una variabile $ _SESSION in PHP tramite XSS?

4

Non sono sicuro che quello che sto dicendo abbia senso ... ma è possibile che io modifichi una variabile $ _SESSION al di fuori dello script PHP di destinazione?

Uno dei nostri script usa una variabile $ _SESSION e non sono sicuro che sia vulnerabile alla manipolazione dall'esterno come una variabile $ _POST è ...

    
posta Steve 09.02.2011 - 13:31
fonte

3 risposte

8

La risposta a questo dipende dal fatto che l'applicazione utilizzi o meno i dati GET o POST per popolare i dati SESSION.

Supponiamo ad esempio che $ _SESSION ['username'] sia popolato quando l'utente effettua il login in questo modo:

$_SESSION['username'] = $_GET['login-username']

Poiché l'XSS possiede il tuo cliente, può anche modificare il contenuto della variabile login-username, e quindi controllare le variabili di sessione.

Tuttavia è importante sapere che l'array di variabili globali $ _SESSION può essere modificato solo dal lato server.

    
risposta data 09.02.2011 - 14:08
fonte
1

La variabile $_SESSION non viene mai inviata al Cliente. È memorizzato esclusivamente sul server. L'utente riceve solo un ID, che viene utilizzato da PHP per caricare la variabile $_SESSION corrispondente.

Quindi no, utilizzando esclusivamente XSS, non puoi modificare la variabile $_SESSION .

Chiarimento

Se una riga come $_SESSION['password'] = $var non si trova da nessuna parte nel codice, XSS non può modificare il valore di $_SESSION['password'] .

    
risposta data 09.02.2011 - 13:52
fonte
1

Mike ha una buona risposta. Non so perché è stato votato in ribasso (quindi l'ho votato di nuovo). Mi sono appena iscritto quindi non posso commentare, ma mi piacerebbe provare a spiegare il ragionamento di Mike, perché sta facendo un buon punto.

La domanda originale era:

One of our scripts uses a $_SESSION variable and I'm not sure if that is vulnerable to manipulation from outside as a $_POST variable is...

Interpreto questo come chiedendo, "l'utente è in grado di manipolare $ _SESSION direttamente dalla richiesta HTTP, come può fare con $ _COOKIE, $ _POST e $ _GET?"

In altre parole, PHP prenderà letteralmente i dati dell'utente dagli header o dal corpo della richiesta e li nasconderà in questi tre superglobali. Ma farà la stessa cosa per $ _SESSION?

La risposta è (nella maggior parte dei casi) decisamente no. La memoria di sessione predefinita in PHP è "file", il che significa che le sessioni sono serializzate e scritte in un file sul filesystem locale. L'utente non ha modo di manipolare direttamente i contenuti di una sessione.

Ora, come altri hanno sottolineato sopra, se fai qualcosa del genere:

$_SESSION['foo'] = $_POST['bar'];

Quindi l'utente può ora influenzare $ _SESSION indirettamente influenzando $ _POST! Naturalmente questo è vero, ma non ho visto questo come il punto della domanda. L'utente può influenzare qualsiasi cosa se non si disinfettano gli input dell'utente. Il punto è sapere quali input non sono disinfettati e sapere come disinfettarli prima di usarli.

Le critiche di Karrax sopra erano:

If XSS changes values on the client which is then used in the session variable you have successfully changed the $_SESSIOn by using XSS.

Naturalmente questo è vero, ma non è il punto della domanda. Secondo la tua logica, possiamo anche dire che "l'input dell'utente malintenzionato può lanciare un razzo sulla luna". Questa è una vera affermazione se qualcuno della NASA ha dimenticato di disinfettare i propri input utente nell'applicazione di controllo del razzo, ma questo è un problema con il software della NASA, non un rischio intrinseco in PHP.

Sfortunatamente, PHP non rende ovvio quali superglobali non sono macchiati e che sono contaminati. Comprendere la distinzione richiede una comprensione di livello intermedio del protocollo HTTP e il modo in cui il runtime di PHP elabora il ciclo di richiesta e risposta HTTP.

    
risposta data 09.03.2011 - 15:30
fonte

Leggi altre domande sui tag