php_admin_value disable_functions不起作用

问题描述 投票:4回答:4

我正在尝试在我的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标志没有设置一样。

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

php security apache2
4个回答
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文件。


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并修改池配置。


1
投票

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

虽然很难看到锁定函数disable_functions只能通过php.ini实现,但仍然有办法至少以某种方式摆脱函数。这是如何:

我们想要摆脱exec,因此我们创建了我们想要的代码,我们不想轻易访问exec内的namespace。这里我们将调用命名空间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方法,这是一个更不完美的尝试来放弃priveledges。

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


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”被保留为禁用的函数。在此文件中此条目之前或之后不存在其他行。)
  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)。

© www.soinside.com 2019 - 2024. All rights reserved.