如何拒绝所有子目录中的 shell 执行?

如何拒绝所有子目录中的 shell 执行?

我希望 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 并将文件移动到临时位置。

  1. 返回下一个可用的循环设备 - 将是 /dev/loop[0-8] 之一

    sudo losetup -f  
    
  2. 创建一个映像作为文件系统 - 这将在 /opt 中创建一个 1GB 的文件

    sudo dd if=/dev/zero of=/opt/uploads_fs.img bs=1M count=1024  
    
  3. 配置第一个命令中返回的环回设备以使用新文件

    losetup /dev/loop0 /opt/uploads_fs.img    
    
  4. 创建文件系统

    mkfs.ext4 -m 1 -v /dev/loop0  
    
  5. 在新设备上安装 /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 文件传递​​给将解析或执行它们的程序时,才需要拒绝规则。

相关内容