我正在尝试在我的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标志没有设置一样。
有想法该怎么解决这个吗?
disable_functions
只能在php.ini文件中更改:
Name Default Changeable Changelog
disable_functions "" PHP_INI_SYSTEM only Available since PHP 4.0.1.
但是,php_admin_value
不能用于.htaccess文件。
我不同意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并修改池配置。
为了提供所有可以做的事情,我想添加这个答案。
虽然很难看到锁定函数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会变得更安全,这确实是不可取的;)
正如@john在上面的回答中所说,你只能附加到任何已经定义的disable_functions值,而不是删除已经禁用的值。这对于PHP-FPM来说变得更加复杂,因为它设置基值的方式。但是,有一个解决方案,由CPanel技术支持社区经理here, but buried deep in a thread详细说明,因此我将列出这些步骤。
mkdir /var/cpanel/ApachePHPFPM
touch /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml
---
php_admin_value_disable_functions: { name: 'php_admin_value[disable_functions]', value: passthru,system }
(注意:是的,---行是预期的。在这个例子中,“passthru,system”被保留为禁用的函数。在此文件中此条目之前或之后不存在其他行。)/scripts/php_fpm_config --rebuild
/scripts/restartsrv_apache_php_fpm
/scripts/restartsrv_httpd
此外,请记住,网站上的PHPINFO输出将与您在自定义PHP-FPM配置文件中配置的内容相匹配,尽管其他PHP函数被禁用(这是PHP和PHP-FPM如何工作的工件)与cPanel&WHM的实施方式相反。
我可以确认按照上述步骤允许我删除其中一个预先禁用的函数(shell_exec)。