我有许多用户的设置,他们可以在他们家中托管他们的个人网页(由 apache 提供服务mod_userdir
)public_html
。php 支持也在 apache 中启用。
目前我有以下配置/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 脚本都是由 user 运行的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 的环境中运行每个用户页面?