5

我试图在我的 apache2 配置文件中禁用功能,但由于某种原因它不起作用。我已经验证其他 php_admin_value 设置正在工作,但它只是忽略了 disable_functions

这是我所拥有的:

<Directory "/var/www/testdir/*">

php_admin_value open_basedir "/var/www/testdir"
php_admin_value disable_functions "exec,shell_exec"

</Directory>

open_basedir 管理值按预期工作(不能包括'../something'),但是,它仍然会执行ls -a ..或让我exec('ls -a ..', $output); echo $output;,就好像disable_functions 标志甚至没有设置一样。

有想法该怎么解决这个吗?

4

4 回答 4

8

disable_functions只能在php.ini文件中更改:

Name                Default Changeable          Changelog
disable_functions   ""      PHP_INI_SYSTEM only Available since PHP 4.0.1.

但是,php_admin_value不能在 .htaccess 文件中使用。

于 2013-10-20T10:30:49.013 回答
2

我不同意秋葵。您绝对可以从 php.ini 修改 disable_function。但需要注意的是,您不能覆盖已经定义的内容。您只能附加到该数组。例如,如果您的 php.ini 文件中没有 disable_functions,您可以附加:

php_admin_value[disable_functions] = link,symlink,popen,exec,system,shell_exec,show_source,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

另一面是,如果你的 php.ini 文件说 popen 被禁用,你不能通过使用 php_admin_value 覆盖它。

我在 php 5.5.9 上尝试了一些尝试来解决问题。我尝试覆盖 disable_function 的 php 值。虽然 phpinfo() 在我覆盖后将 disable_function 行显示为空。最初在 php.ini 文件中列出的函数均不可用。

作为记录,我的尝试是使用 php5-fpm 并修改池配置。

于 2014-11-21T21:21:15.363 回答
2

正如@john 在上面的回答中所说,您只能附加到任何已定义的 disable_functions 值,而不能删除那些已禁用的值。这在 PHP-FPM 中变得更加复杂,因为它设置基值的方式。但是,有一个解决方案,由 CPanel 技术支持社区经理在这里详细介绍,但深埋在一个线程中,因此我将列出这些步骤。

  1. 创建 /var/cpanel/ApachePHPFPM 目录:

    mkdir /var/cpanel/ApachePHPFPM

  2. 创建 /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml 文件:

    touch /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml

  3. 使用您喜欢的文本编辑器(例如 vi、nano)编辑 /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml,使其看起来完全像这样:

    --- php_admin_value_disable_functions: { name: 'php_admin_value[disable_functions]', value: passthru,system }

    (注意:是的,--- 行是有意的。在本例中,“passthru,system”保留为禁用功能。此文件中此条目之前或之后不存在其他行。)

  4. 通过以下方式重新生成 PHP-FPM 配置文件:

    /scripts/php_fpm_config --rebuild

  5. 重启 Apache PHP-FPM 和 Apache 服务:

    /scripts/restartsrv_apache_php_fpm /scripts/restartsrv_httpd

此外,请记住,网站上的 PHPINFO 输出将匹配您在自定义 PHP-FPM 配置文件中配置的内容,尽管禁用了其他 PHP 功能(这是 PHP 和 PHP-FPM 工作方式的产物)反对如何使用 cPanel 和 WHM 实现它们)。

我可以确认按照上述步骤可以删除其中一个预先禁用的功能 (shell_exec)。

于 2018-09-04T11:28:36.333 回答
1

为了提供所有可以做的事情,我想添加这个答案。

虽然很遗憾地看到锁定功能disable_functions只能通过php.ini仍然有一种方法至少可以以某种方式摆脱该功能。这是如何:

我们想摆脱,exec因此我们创建了我们不希望在命名空间内部轻松访问的代码。在这里,我们将调用命名空间,在里面我们将简单地创建一个我们想要复杂化(*)访问的空函数。execdisableFunctionNamespace

<?php
namespace disableFunctionNamespace;
function exec(){};

//here the code which should not be easily(*) able to call the exec function
exec("rm /* -rf");

?>

*) 虽然一个简单的、转储尝试调用exec命名空间内的函数实际上会失败,但不幸的是,攻击者可以通过简单地调用/exec而不是exec返回全局命名空间来逃避命名空间,并通过逃避exec函数在当前命名空间。因此,与chroot有时在某些 linux 中使用的方法相比,放弃特权的尝试更加不完美。

如果有办法将功能列入白名单,那么使用其他形式禁用功能甚至更好的建议将不胜感激,但不太可能,因为 php 会变得更安全,这确实是不可取的;)

于 2014-03-14T12:54:41.237 回答