it-swarm-es.com

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

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

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

4
Steve

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

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

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

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

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

8
Chris Dale

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

Entonces no, al usar XSS exclusivamente, no puede cambiar el $_SESSION variable.

Aclaración

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

1
Mike

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

La pregunta original era:

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

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

En otras palabras, PHP literalmente tomará los datos del usuario de los encabezados o el cuerpo de la solicitud y los almacenará en esas tres superglobales. Pero, ¿hará lo mismo con $ _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 el contenido de una sesión directamente.

Ahora bien, como otros señalaron anteriormente, si haces algo como esto:

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

¡Entonces el usuario ahora puede afectar $ _SESSION indirectamente al afectar $ _POST! Por supuesto que esto es cierto, pero no vi que este fuera el punto de la pregunta. El usuario puede afectar cualquier cosa si no desinfecta las entradas del usuario. El punto es saber qué insumos no están desinfectados y saber cómo desinfectarlos antes de usarlos.

La crítica de Karrax anterior fue:

Si XSS cambia valores en el cliente que luego se usa en la variable de sesión, ha cambiado con éxito $ _SESSIOn usando XSS.

Por supuesto que esto es cierto, pero no es el punto de la pregunta. Según su lógica, también podemos decir que "la entrada de un usuario malintencionado puede lanzar un cohete a la luna". Esto es una afirmación verdadera si alguien en la NASA olvidó desinfectar las entradas de sus usuarios 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 deja en claro 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 cómo el tiempo de ejecución PHP procesa la solicitud HTTP y el ciclo de respuesta.

1
Mark E. Haase