在PHP / Apache / Linux上下文中,为什么chmod 777是危险的?

受到这个问题的讨论启发,可能是一个愚蠢的问题。

我们都被告知,在基于Linux的虚拟主机上保留目录或文件的权限级别为777是一件坏事,并且根据需要设置一些权限。

我现在好奇到底是在哪里开发的危险,特别是在PHP / Apache的情况下。

毕竟,PHP脚本文件可以从外部执行(即通过调用Web服务器,然后到解释器),无论它是否被标记为“可执行”,不是吗? 这同样适用于通过命令行php解释器调用的文件,对吧?

那么777的漏洞到底在哪里呢? 是否在同一台机器上的其他用户可以访问世界可写的文件?

这里有一个场景:

  1. 你有一个不受保护的目录,用户可以上传到。
  2. 他们上传两个文件:一个shell脚本和一个将system()调用到shell脚本的php文件。
  3. 他们通过访问浏览器中的url来访问他们刚刚上传的php脚本,导致执行shell脚本。

如果这个目录是777,这意味着任何人(包括用户apache,这是php脚本将执行的)可以执行它! 如果执行位未在该目录中设置,并且可能是目录中的文件,则上面的步骤3将不会执行任何操作。

从注释中编辑:这不是PHP文件的权限,它是PHP文件中的system()调用,它将作为linux用户apache的Linux系统调用执行(或者你有apache设置运行的任何东西),这是执行位重要的地方。

在权限方面,遵循极简主义有许多好的一般原因,但是在LAMP虚拟主机的环境中,less数人想到的是

  • 在共享主机平台上,共享主机的其他用户现在可以读写您的脚本。
  • 在专用主机上,胭脂进程可以读/写并意外删除文件。 比方说,有一个自定义日志logging进程在后台运行,作为用户nobody,有一个错误,导致它试图rm -rf / 。 现在通常这将是无害的,因为几乎没有任何文件,没有人应该有写权限,但这个胭脂过程将现在带你的文件。
  • 要破坏你的网站,有人只需要获得任何用户的访问权限,甚至不要说任何人或某些这样的虚拟帐户。 一般来说,攻击者必须进一步进行用户级别升级攻击才能到达可以造成一定损害的地方。 这是一个真正的威胁。 某些非关键服务可能在虚拟帐户下运行,并可能包含漏洞。

它大大增加了您的网站对恶意活动的漏洞configuration文件,因为它只需要闯入一个帐户。

任何通过任何login访问系统的人都可以为自己的页面做任何他们想做的事情,包括更改为“这个网站真的不安全,所以请给我你的信用卡信息”。

编辑:(澄清和地址评论)

许多服务器在生活中有不止一个目的。 他们运行多个服务。 如果您通过分配每个唯一的用户并相应地pipe理文件权限来仔细隔离这些服务,是的,如果某人损害了某个帐户的凭据,您仍然处于热水中,但是他们所能做的损害仅限于该服务。 如果您只有一个通用帐户,并将整个文件系统设置为777,则一个受到危害的帐户会危及计算机上的所有内容。

如果您的服务器专门用于运行Apache / PHP,并且没有任何其他用途,并且只有一个帐户正在运行Apache / PHP,那么这个帐户被盗用就像整个机器受到攻击一样好您的应用程序的angular度(尽pipe您应该仍然有系统文件保护和用于运行PHP帐户不可写入…应该仍然只能用于pipe理员帐户/根目录)。

如果他们可以编写一个文件,并且它是可执行的,他们可以将其更改为在您的计算机上执行的东西(可执行文件或脚本),然后使用PHP的shell_exec来运行该可执行文件。 如果你configuration不允许shell_exec,他们也可以改变你的configuration

假设您的服务器中已安装了软件包,并且存在零日漏洞,攻击者可通过上传文件function访问pipe理控制面板,如果将所有内容设置为777,则上传shell脚本他想要的任何地方。 但是,如果你正确设置权限,他不能这样做,因为nobody / www-data / etc将不具有写权限。