Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: WHK en 31 Mayo 2009, 08:45 am



Título: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: WHK en 31 Mayo 2009, 08:45 am
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é.


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: isseu en 31 Mayo 2009, 08:52 am
interesante..
esto podria ser mucho mas grande que solo phpnuke, ¿seguro que no habia sido descubierto antes?


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: WHK en 31 Mayo 2009, 09:01 am
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


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: ‭lipman en 31 Mayo 2009, 09:36 am
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?


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: WHK en 31 Mayo 2009, 09:51 am
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
  1. <?php
  2.  
  3. function seo_permalink($value) {
  4. $turkce=array(
  5. "&#351;","&#350;","&#305;","(",
  6. ")","'","ü","Ü",
  7. "ö","Ö","ç","Ç",
  8. " ","/","*","?",
  9. "&#351;","&#350;","&#305;","&#287;",
  10. "&#286;","&#304;","ö","Ö",
  11. "Ç","ç","ü","Ü");
  12. $duzgun=array(
  13. "s","S","i","",
  14. "","","u","U",
  15. "o","O","c","C",
  16. "","-","-","",
  17. "s","S","i","g",
  18. "G","I","o","O",
  19. "C","c","u","U");
  20. $value=str_replace($turkce,$duzgun,$value);
  21. $value = preg_replace("@[^A-Za-z0-9\-_]+@i","",$value);
  22. return $value;
  23. }
  24.  
  25. echo seo_permalink('nick o url maligno "xÑoàöd"');
  26.  
  27. ?>

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.


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: ‭lipman en 31 Mayo 2009, 10:22 am
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


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: Azielito en 1 Junio 2009, 17:16 pm
Tambien en mi version [PHP Version 5.2.5 ] da error
Código:
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


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: WHK en 2 Junio 2009, 02:43 am
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).

Citar
See 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:
Citar
Hola, 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.


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: s E t H en 10 Junio 2009, 01:24 am
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?



Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: WHK en 10 Junio 2009, 04:08 am
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.


Título: Re: Bug en php 5.2.9 y versiones anteriores (Path disclosure)
Publicado por: s E t H en 11 Junio 2009, 04:08 am
lo de apache lo puse porque lo muestra mal, pero poc.php funciona bien
lo renombre a index.php y sigue igual

les dejo un pedazo del php.ini:
Citar
error_reporting  =  E_ALL

; Print out errors (as a part of the output).  For production web sites,
; you're strongly encouraged to turn this feature off, and use error logging
; instead (see below).  Keeping display_errors enabled on a production web site
; may reveal security information to end users, such as file paths on your Web
; server, your database schema or other information.
display_errors = On

; Even when display_errors is on, errors that occur during PHP's startup
; sequence are not displayed.  It's strongly recommended to keep
; display_startup_errors off, except for when debugging.
display_startup_errors = On