¿Alterando una variable $ _SESSION en PHP a través de XSS?

4

No estoy seguro si lo que estoy diciendo tiene sentido ... pero ¿es posible para mí modificar una variable $ _SESSION desde fuera del script PHP de destino?

Uno de nuestros scripts utiliza una variable $ _SESSION y no estoy seguro de si es vulnerable a la manipulación desde el exterior, ya que una variable $ _POST es ...

    
pregunta Steve 09.02.2011 - 13:31
fuente

3 respuestas

8

La respuesta a esto depende de si su aplicación utiliza o no datos GET o POST para completar los datos de SESSION.

Digamos, por ejemplo, que la $ _SESSION ['nombre de usuario'] se rellena cuando el usuario inicia sesión así:

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

Como el XSS posee a su cliente, también puede modificar el contenido de la variable login-username, y así controlar las variables de la sesión.

Sin embargo, es importante saber que la matriz de variable global $ _SESSION solo se puede modificar en el lado del servidor.

    
respondido por el Chris Dale 09.02.2011 - 14:08
fuente
1

La variable $_SESSION nunca se envía al cliente. Se almacena exclusivamente en el servidor. El usuario solo obtiene una ID, que PHP utiliza para cargar la variable $_SESSION correspondiente.

No, al utilizar XSS exclusivamente, no puede cambiar la variable $_SESSION .

Aclaración

Si no se encuentra una línea como $_SESSION['password'] = $var en su código, XSS no puede cambiar el valor de $_SESSION['password'] .

    
respondido por el Mike 09.02.2011 - 13:52
fuente
1

Mike tiene una buena respuesta. No sé por qué fue rechazado (así que le voté de nuevo). Me acabo de unir, así que no puedo hacer comentarios, pero me gustaría intentar explicar el razonamiento de Mike, porque él está haciendo un buen punto.

La pregunta original era:

  

Uno de nuestros scripts utiliza una variable $ _SESSION y no estoy seguro de si es vulnerable a la manipulación desde el exterior, ya que una variable $ _POST es ...

Interpreto esto como preguntando: "¿puede el usuario manipular $ _SESSION directamente desde la solicitud HTTP, como lo puede hacer con $ _COOKIE, $ _POST y $ _GET?"

En otras palabras, PHP tomará literalmente los datos del usuario de los encabezados o el cuerpo de la solicitud y los almacenará en esos tres superglobales. Pero, ¿hará lo mismo por $ _SESSION?

La respuesta es (en la mayoría de los casos) definitivamente no. El almacenamiento de sesión predeterminado en PHP es "archivo", lo que significa que las sesiones se serializan y escriben en un archivo en el sistema de archivos local. El usuario no tiene forma de manipular directamente el contenido de una sesión.

Ahora, como han señalado otros, si haces algo como esto:

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

¡Entonces el usuario ahora puede afectar a $ _SESSION indirectamente al afectar a $ _POST! Por supuesto, esto es cierto, pero no vi esto como el punto de la pregunta. El usuario puede afectar cualquier cosa si no desinfecta las entradas del usuario. El punto es saber qué entradas no están saneadas y saber cómo sanearlas antes de usarlas.

La crítica de Karrax anterior fue:

  

Si XSS cambia los valores en el cliente, que luego se usa en la variable de sesión, usted cambió exitosamente el $ _SESSIOn usando XSS.

Por supuesto, esto es cierto, pero no es el punto de la pregunta. Según su lógica, también podemos decir que "la entrada de usuarios malintencionados puede lanzar un cohete a la luna". Esta es una declaración verdadera si alguien en la NASA olvidó limpiar sus entradas de usuario en la aplicación de control de cohetes, pero eso es un problema con el software de la NASA, no un riesgo inherente en PHP.

Desafortunadamente, PHP no hace obvio qué superglobales no están contaminados y cuáles están contaminados. Comprender la distinción requiere una comprensión de nivel intermedio del protocolo HTTP y de cómo el tiempo de ejecución de PHP procesa el ciclo de solicitud y respuesta HTTP.

    
respondido por el Mark E. Haase 09.03.2011 - 15:30
fuente

Lea otras preguntas en las etiquetas