我有一个具有许多用户的设置,他们可以在自己的家mod_userdir
中托管他们的个人网页(由 apache 通过 提供服务)public_html
。apache 中也启用了 php 支持。
目前我有以下配置/etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
UserDir <home basedir>/*/public_html
UserDir disabled root
<Directory <home basedir>/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes Options
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS>
Require all denied
</LimitExcept>
</Directory>
</IfModule>
问题是,由于每个 php 脚本都是由用户运行的www-data
,因此每个用户页面都对其他所有用户的页面都有权限public_html
。例如,我可以获取一个 php 反向 shell 并检查其他用户的内容。
我曾尝试添加
php_admin_value open_basedir "."
上面的标签内Directory
。这可以防止上述安全漏洞,但实际上只允许 php 脚本沿目录层次向下运行。例如
<?php
chdir('assets');
echo getcwd();
chdir('..');
echo "<br>";
echo getcwd();
?>
生产
<home>/public_html/assets
<home>/public_html/assets
<home>/public_html
如果路径在变量中硬编码,问题就解决了open_basedir
,但我当然需要能够通过某个变量为所有用户执行此操作。apache 是否将通配符 ( <home basedir>/*/public_html
) 匹配存储在我可以在Directory
标签内访问的某个变量中?或者还有其他更好的方法可以做到这一点,例如在类似 chroot 的环境中运行每个用户页面?