php_admin_value disable_functions不起作用

时间:2013-10-20 01:59:06

标签: php security apache2

我正在尝试在我的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 个答案:

答案 0 :(得分:7)

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

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

但是,php_admin_value不能用于.htaccess文件。

答案 1 :(得分:2)

我不同意Gumbo。你绝对可以从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并修改池配置。

答案 2 :(得分:1)

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

虽然这是很悲哀地看到,封锁住功能disable_functions只能通过php.ini还有可能是至少获得某种方式摆脱了功能的可能的方式。这是如何:

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

<?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函数的阴影。因此,在某些linux中有时会使用chroot方法,这是一个更不完美的尝试。

Surrely建议使用其他形式来禁用功能或甚至更好,如果有办法将白名单函数提供将非常感激,但不太可能因为php会变得更安全,这确实是不可取的;)

答案 3 :(得分:1)

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

  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”保留为禁用功能。此文件中此条目之前或之后没有其他行。)

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

    /scripts/php_fpm_config --rebuild

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

    /scripts/restartsrv_apache_php_fpm /scripts/restartsrv_httpd

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

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