2009-09-08 18 views
6

Como cada usuario tiene un PHPSESSID único, es posible que dos usuarios, por ejemplo, que inyecten información en los datos de SESSION de b utilizando PHP estándar que se ejecuta en el servidor.PHP Inyectar en otra sesión de usuarios

Nota, no estoy usando esto para ningún propósito equivocado. Tratando de usarlo para chatear sin acceso a DB.

Gracias por su tiempo.

Respuesta

6

Asumo que quiere tener de alguna manera una charla a B mediante el envío de un mensaje que se guarde dentro de la sesión B.

Antes que nada, A necesita aprender la ID de la sesión de B, tal vez seleccionando su nombre de una lista. Seguramente querrá cifrar estos identificadores de sesión; de lo contrario, habrá creado un buen agujero de seguridad.

Por lo tanto, A publica datos en el servidor que contiene la Id. De sesión de destino y un mensaje. Así es como podríamos identificadores de sesión interruptor temporales para escribir estos datos en la sesión de destino:

//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

leer sobre session fixation

+0

No creo que el OP pregunte acerca de los ataques de sesión, sino más acerca de cómo escribir código que puede actualizar otra sesión. –

0

No puedo decir con seguridad, pero dado que los datos de sesión por defecto es almacenada en un archivo, si su aplicación conoce el identificador de sesión del otro usuario podría reemplazar en el archivo de sesión que fue escrito por las funciones de sesión estándar con datos alterados. La próxima vez que el otro usuario acceda a una secuencia de comandos, se cargarán los datos de la sesión modificada.

Pero usted está arriesgando todo tipo de condiciones de carrera y conflictos si solo hace esto además del manejo integrado de la sesión. Es probable que desee reemplazar las funciones de manejo de sesiones con las suyas para que pueda resolver todos estos problemas. Los problemas son probablemente mucho más complejos de lo que parecen en la superficie.

Ver: http://www.php.net/manual/en/session.customhandler.php para obtener información sobre manejadores de sesión personalizados

0

manejador de sesión predeterminada de PHP utiliza sólo el identificador de sesión para identificar la sesión. Eso hace posible usar el ID de sesión de otro usuario y, por lo tanto, usar la misma sesión (Session Hijacking). Otro ataque es preparar una sesión y hacer que la víctima use esa sesión para que la víctima y el atacante vuelvan a utilizar la misma sesión (Session fixation).

La base para tales ataques es que solo necesita saber la ID de la sesión para usar la sesión que está asociada a ella. Las técnicas de prevención son para usar más información de identificación que solo la ID de la sesión. Algunos sugieren usar la dirección IP (pero eso puede cambiar durante una sesión) o el identificador del agente de usuario. Otra técnica es ocultar el ID de sesión externamente al permitir solo una cookie y HTTPS.

Pero también tenga en cuenta el alojamiento compartido. Algunos pueden usar un grupo común para todos los archivos de datos de sesión de todos los cumstomers.

1

La sesión es algo simple que se puede volver a implementar fácilmente para hacer lo que desee.Echar un vistazo a este sencillo exemple que escribí hace algún tiempo: http://pastebin.com/f3ca0ae8d

Uso:

  • new mySession(); haciendo lo mismo que session_start();
  • $_MYSESSION haciendo lo mismo que $_SESSION
  • delete mySession(); haciendo lo mismo que session_write_close(); No es necesario utilizarlo a menos que desee liberar la sesión antes del final del script.

Puede hacer algunas adaptaciones para usarlo en su propósito específico, como definir la ID de sesión usted mismo para que pueda compartirla entre diferentes usuarios. Como $ _MYSESSION será común entre los usuarios, también puede usar sesiones regulares de PHP junto con él para almacenar información específica del usuario en $ _SESSION.

[Editar]

http://pastebin.com/f3c31737e

Ejemplo: Introduzca el canal $ _SESSION todas las líneas sin leer [ 'channelId'] e imprimir.


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
";

Ejemplo: Hable con el canal.


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

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

etc ...

1

En lugar de pedos alrededor con lo que es, en esencia, manejando archivo indirecta a través del sistema de la sesión, por qué no ir directamente al grano y utilizar archivos de texto?

Es menos vulnerable a los ataques, y también menos volátil, en el sentido de que las versiones futuras de PHP podrían decidir evitar este tipo de cambio de sesión por razones de seguridad (completo hipotético, pero tiene sentido).

Cuestiones relacionadas