我的服务器上有一个文件夹,我已将权限更改为 777(读取、写入和执行全部),以允许用户上传他们的图片。
所以我想知道,这其中涉及到哪些安全风险?
我已经实现了代码来限制可以上传的文件格式,但是如果有人找到目录的位置会发生什么,这会对我的服务器造成任何威胁吗?
他们可以开始上传他们想要的任何文件吗?
谢谢。
当用户通过 web 表单和一些 PHP 脚本将文件上传到您的服务器时,服务器上的磁盘访问发生在运行 web 服务器的用户 id 下(通常是 nobody、www-data、apache、_httpd 甚至 root)。
请注意,无论是哪个用户上传文件,都会使用此单个用户 ID 。
只要没有本地用户通过其他方式(ssh
例如)访问系统,将上传目录权限设置为0777
不会有太大的不同——除了有人利用系统中其他地方的安全漏洞之外,没有人这些权限无论如何都适用,这样的攻击者可能只会使用/tmp
.
最好只对文件或目录设置实际需要的权限。在这种情况下,这可能意味着:
drwxrws--- 5 www-data www-data 4096 Nov 17 16:44 upload/
我假设除了 Web 服务器之外的其他本地用户也想要访问这些文件,例如系统管理员或网页设计师。将这些用户添加到您的 Web 服务器运行所在的组中,他们不需要sudo
或 root 权限来访问该目录。此外,这+s
意味着其中的新文件和目录upload/
将自动归同一组所有。
至于你的最后一个问题:仅仅因为攻击者知道目录在哪里,并不意味着他可以神奇地使文件出现在那里。仍然必须运行某种服务来接受文件并将它们存储在那里......所以不,将权限设置为0777
并不会直接降低安全性。
尽管如此,在整个设置中,您无法通过文件权限解决“安全”和“安全性”的更多维度:
...而且可能还有更多。您可能已经在上传脚本中解决了其中一些问题,但话又说回来,在了解安全问题时,通常一开始就对 unix 文件权限及其应用位置的理解很重要,这表明您可能还没有准备好解决所有问题的可能问题。
有人看过你的代码!
这些用户通过什么方式上传他们的照片?如果是通过网络,那么您只需要授予网络服务器或 CGI 脚本用户访问该文件夹的权限。
这里最大的危险是用户可以覆盖其他用户文件,或删除其他用户文件。没有访问此文件夹的任何人都无法写入(除非您有某种来宾/匿名用户)。
如果您需要一个每个人都可以在其中创建文件的目录,那么您想要的是模仿 /tmp 目录的权限。
$ chown root:根目录;chmod 777 目录;chmod +t 目录;
这样,任何用户都可以创建文件,但不能删除其他用户拥有的文件。
与其他人所说的相反,unix 系统中目录上的可执行位意味着您可以将该目录设为当前目录(cd 到它)。它与执行无关(执行目录是没有意义的)。如果您删除可执行位,则没有人可以“cd”到它。
如果不出意外,我会删除所有用户的可执行权限(如果不是所有者和组)。启用此功能后,有人可以上传看起来像图片但实际上是可执行文件的文件,这可能会造成无休止的损害。
除非您需要匿名访问,否则可能还删除所有用户的读写权限并将其限制为所有者和组。
您不想打开可执行位。就 *nix 而言,可执行位意味着您可以实际运行该文件。因此,例如,php 脚本可以上传为 JPEG 类型,然后如果有人知道位置并且它在 web 目录中,他们就可以运行该脚本。