我正在尝试在我的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标志不均匀集。
有关如何解决此问题的任何想法?
答案 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详细介绍,因此,我将列出步骤。
创建/ var / cpanel / ApachePHPFPM目录:
mkdir /var/cpanel/ApachePHPFPM
创建/var/cpanel/ApachePHPFPM/system_pool_defaults.yaml文件:
touch /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml
使用您喜欢的文本编辑器(例如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>通过以下方式重新生成PHP-FPM配置文件:
/scripts/php_fpm_config --rebuild
重新启动Apache PHP-FPM和Apache服务:
/scripts/restartsrv_apache_php_fpm
/scripts/restartsrv_httpd
此外,请记住,尽管禁用了其他PHP功能,但网站上的PHPINFO输出将与您在自定义PHP-FPM配置文件中配置的内容相匹配(这是PHP和PHP- FPM的工作方式与cPanel和WHM的实现方式相反。
我可以确认,按照上述步骤操作,可以删除一个预禁用的功能(shell_exec)。