我希望 nginx 拒绝在 /webroot/uploads 内有文件夹的用户
例如
/webroot/uploads/user1
/webroot/uploads/user2
/webroot/uploads/user1000
执行任何 shell (php、pl、exe)。
这些外壳通常隐藏在 jpg 或 gif 文件中。例如 badfile.php.jpg
我还看到恶意二进制文件被上传到该文件夹。
这是我的初步规则:
location ~ /webroot/uploads/(.+)\.php$ {
deny all;
}
location ~ /webroot/uploads/(.+)\.pl$ {
deny all;
}
但我不确定它是否坚固。所以我很感谢你的帮助。
答案1
如果您想绝对确保在 /webroot/uploads 或下面的任何地方都不会执行任何操作,我建议在文件系统级别阻止执行。为 /webroot/uploads 创建一个文件系统,并使用“noexec”选项挂载它:
mount -t ext4 -o 'noexec,rw' /dev/<device-name> /webroot/uploads/
笔记:如果您正在使用托管服务器,或者没有可用于配置文件系统的存储,则可以将其安装到环回设备上:
警告:在运行以下命令之前,请备份 /webroot/uploads 并将文件移动到临时位置。
返回下一个可用的循环设备 - 将是 /dev/loop[0-8] 之一
sudo losetup -f
创建一个映像作为文件系统 - 这将在 /opt 中创建一个 1GB 的文件
sudo dd if=/dev/zero of=/opt/uploads_fs.img bs=1M count=1024
配置第一个命令中返回的环回设备以使用新文件
losetup /dev/loop0 /opt/uploads_fs.img
创建文件系统
mkfs.ext4 -m 1 -v /dev/loop0
在新设备上安装 /webroot/uploads 并使用 noexec 设置
mount -t ext4 -o 'noexec,rw' /dev/loop0 /webroot/uploads/
在此刻,将您的文件恢复到以前的位置。即使作为 root 用户,您也无法在该文件系统上执行文件:
[root@localhost testfs]# ll myscript*
-rwxrwxrwx. 1 root root 41 Jan 21 19:20 myscript.sh
[root@localhost testfs]# ./myscript.sh
-bash: ./myscript.sh: Permission denied
[root@localhost testfs]#
答案2
这个怎么样?
location ~ /webroot/uploads/.*\.(php|pl|rb|sh)$ {
deny all;
}
默认情况下,nginx 不会将文件传递给解析器或执行它们。它只会为它们提供服务。仅当您已将 nginx 配置为将 php/pl/rb 文件传递给将解析或执行它们的程序时,才需要拒绝规则。