Bug en php 5.2.9 y versiones anteriores (Path disclosure)

Iniciado por WHK, 31 Mayo 2009, 08:45 AM

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

WHK

Estaba en mi servidor local y pude percatarme de un bug bién raro.
Enciende tu servidor local y haz un nuevo directorio con cualquier nombre que contenga la letra "ñ" y pon dentro un archivo php o html con cualquier contenido.
Si lo intentas visualizar verás que php lanza un error y da el path disclosure:
Citar
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'C:/wamp/www/portal_foro/diseño/index.php' (include_path='.;C:\php5\pear') in Unknown on line 0

Nakp me ayudó y pudo verificar que esto también funciona en servidores Linux y con casi cualquier carácter especial como por ejemplo acentos.

Esto puede dificilmente pero posible transformarse en una vulnerabilidad como por ejemplo en el mod My_Uploads de phpnuke donde se crea un nuevo directorio dependiendo del nombre de usuario, claramente esto tiene un filtro de no incluir slashses y puntos pero estos filtros no consideran carácteres especiales haciendo el directorio lo mas fiél posible al nick del usuario pero sin contar que php no está preparado para eso lanzando este tipo de errores y mostrando la ruta total del directorio dando información a un posible atacante.

Ya lo avisé.

isseu

interesante..
esto podria ser mucho mas grande que solo phpnuke, ¿seguro que no habia sido descubierto antes?

WHK

Que yo sepa no, busqué info en gogole y no encontré nada relacionado además si alguien mas lo hubiera dicho ya estarían en una versión de php que no tuviera ese bug

‭lipman

Hmm interesante la verdad. Tenia idea de preparar algo, y la verdad que saber esto me ayuda bastante.

Alguna idea de como verificar todas las letras del contenido de una variable?

WHK

#4
Atraves de un script en php no se puede evitar si el directorio ya está hecho pero si puedes evitar crear directorios así, puedes usar la función de wordpress seo_permalink():

http://cl2.php.net/manual/es/function.preg-replace.php
Código (php) [Seleccionar]
<?php

function seo_permalink($value) {
$turkce=array(
"&#351;","&#350;","&#305;","(",
")","'","ü","Ü",
"ö","Ö","ç","Ç",
" ","/","*","?",
"&#351;","&#350;","&#305;","&#287;",
"&#286;","&#304;","ö","Ö",
"Ç","ç","ü","Ü");
$duzgun=array(
"s","S","i","",
"","","u","U",
"o","O","c","C",
"","-","-","",
"s","S","i","g",
"G","I","o","O",
"C","c","u","U");
$value=str_replace($turkce,$duzgun,$value);
$value preg_replace("@[^A-Za-z0-9\-_]+@i","",$value);
return 
$value;
}

echo 
seo_permalink('nick o url maligno "xÑoàöd"');

?>


Me fijé también que seo no contempla la letra eñe  >:(, de todas formas se filtra al final y no aparecerá en la conversión.

Nota: el geshi del foro no deja ver bién los carácteres especiales asi que si usas el código haz click en citar tema y vee como está posteada la función.

‭lipman

Es una idea lo de sustituir, pero no me referia a eso, y weno, por no abrir un tema en PHP, aprovecho. Lo que digo es lo siguiente:

Tienes una variable con un cierto contenido como "azúcar". Entonces podrias pasar ese contenido a una matriz, poniendo en cada contenido de la matriz una letra:
matriz[0] = a
matriz[1] = z
matriz[2] = ú
....
..

Y luego con un foreach, recorrer toda la matriz y comprobar que cada carácter se encuentra entre el 97 y 122 (ASCII) (bueno aqui serian solo letras minusculas pero podriamos incluir mayúsculas y numeros)

La cuestion seria, como pasar el contenido de una variable a una matriz de la forma que he dicho  :P (que además, no tiene porque ser una palabra, podria ser una frase, y en este caso habria que incluir el espacio en blanco)

Un saludo

Azielito

Tambien en mi version [PHP Version 5.2.5 ] da error
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'G:/Desarrollo/web/www/azi/ñoño/hola.php' (include_path='.;g:\Desarrollo\web\php5') in Unknown on line 0


Tal vez serán todas las versiones de php?:xD

WHK

Bueno ya me enviaron una respuesta desde php y me dijeron que el estado de reportes de errores no debe producir estados del sistema en sistemas publicos o sea que yo debería configurar mi php.ini para no mostrar este tipo de errores.

De todas formas en un hosting de pago es muy raro tener acceso a este tipo de configuracionesy para que decir de los hostings gratuitos.

De todas formas para mi no deja de ser un bug porque puede aprobecharse en hostings donde el propio administrador no tenga acceso a los archivos de configuraciones (la única exepción sería tener un dedicado).

CitarSee http://www.php.net/manual/en/errorfunc.configuration.php#ini.display-errors
Pay special attention to this note:
"Note: This is a feature to support your development and should never be used on production systems (e.g. systems connected to the internet)."

On 31.05.2009 10:49, WHK wrote:
CitarHola, disculpame pero no se hablar ingles.
El problema radica en que php no es compatible con rutas de carácteres especiales.

PoC: http://127.0.0.1/diseño/

Warning: Unknown: failed to open stream: No such file or directory in
Unknown on line 0

Fatal error: Unknown: Failed opening required 'C:/wamp/www/diseño/index.php'
(include_path='.;C:\php5\pear') in Unknown on line 0

Path disclosure remoto en casos como este:
http://foro.elhacker.net/bugs_y_exploits/bug_en_php_529_y_versiones_anteriores_path_disclosure-t256586.0.html

Gracias.
Att, WHK.

s E t H

apache me lo muestra asi al listar el directorio:

Index of /diseño

Icon  Name                    Last modified      Size  Description[DIR] Parent Directory                             -   
[   ] poc.php                 09-jun-2009 20:23    3   


pero el archivo se ve bien
uso xampp
seth@debian:~$ sudo lampp phpstatus
5.2.9


si ponen "error_reporting(0);"  que pasa?


WHK

Obiamente no te da error porque no se está ejecutando php sino el apache, pero y si le haces click al archivo poc.php? o en ves de poc lo renombras a index.php?

si le pones error_reporting(0) al php igual te dará el error ya que se produce antes de la interpretación del script a menos que lo hagas desde el php.ini directamente.