在PHP / Apache / Linux环境下,为什么chmod 777命令会带来危险?

49

此问题中的讨论启发。

我们都知道在Linux基础的Web主机上将目录或文件权限设置为777是一件危险的事情,应该尽可能地减少权限。

我现在很好奇在PHP / Apache环境中,究竟存在哪些利用漏洞的风险?

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

那么,777的漏洞在哪里呢?难道其他用户能够访问被设为全局可写的文件吗?


3
它让每个人都可以阅读、编写和执行代码。 - LiraNuna
5
@LiraNuna 是的,但在这个语境中,“EVERYONE”代表什么?是指同一台机器上的用户吗?还是指机器外的用户?在PHP脚本语境中,“执行”是什么意思?即使文件没有设置“可执行”标志,但仍会被解释执行。请注意,这并不改变原文的意思。 - Pekka
@LiraNuna,假设他的服务器上所有文件都有777权限,你能够“写入”他的index.php文件吗? - user187291
1
你需要软件来进行编写。一旦你找到了一个让你能够编写的漏洞(不是太难),那么你就可以使用apache执行页面。如果机器上安装了PHP或者Perl,你可以在文件顶部放置字符,告诉系统自动运行哪个二进制文件。因此,该文件将被直接执行。为了更有趣,你可以先上传解释器(比如pearl),然后再上传要解释的文件(比如ownme.pl),最后运行pearl来解释ownme.pl。可悲的是,我是从经验中说出这些话的。幸运的是,那不是我的代码,也没有人受伤。 - TheJacobTaylor
2
关于“应该在Serverfault上发布”的投票 - 这完全是一个StackOverflow问题。它涉及我们编写的软件的安全性。 - Eric J.
4个回答

32

以下是一种可能的情况:

  1. 您有一个未受保护的目录,用户可以上传文件到其中。
  2. 他们上传了两个文件:一个 shell 脚本和一个包含 system() 调用的 php 文件。
  3. 他们通过在浏览器中访问刚上传的 php 脚本来访问它,从而导致 shell 脚本被执行。

如果这个目录是 777,那么任何人(包括用户 apache,也就是 php 脚本将作为其执行)都可以执行它!如果该目录以及目录内的文件没有设置执行位,则步骤 3 将什么也不会发生。

根据评论进行编辑:重要的不是 PHP 文件的权限,而是 PHP 文件中的 system() 调用将作为 Linux 系统调用由 Linux 用户 apache(或您设置 Apache 运行的用户)执行,这正是执行位起作用的地方。


2
@Mike,这很有道理,但是我需要设置可执行位来运行PHP文件吗?我现在无法测试,但我认为不需要,Apache/PHP的读取权限足以运行该文件,不是吗? - Pekka
4
不,重要的不是PHP文件的权限,而是PHP文件内的system()函数会作为Linux系统调用执行,这正是执行位很重要的地方。 - Mike Sherov
其他答案关于系统上的任何用户都能够修改源代码并且这是不好的是正确的。然而更令人担忧的是,由于Apache也可以修改文件,这意味着一些Web应用程序漏洞可能会允许互联网上的攻击者(假设站点是公共的)拥有服务器 - 他们可以在服务器上运行自己的代码,接管您的基础架构以及您网站访问者的任何浏览器。我可能有偏见,因为我确实见过这种情况发生。 - mar
2
你好@MikeSherov,抱歉打扰了这个旧问题并提出以下愚蠢的问题...您写道:“您有一个用户可以上传文件的未受保护目录。” 您所说的“用户”是什么意思?如果他们没有FTP访问权限,他们如何上传文件到该目录中?如果我在专用服务器上,我应该没问题,对吗? - testermaster
3
你好@testermaster,据我所知,在网页中未经过滤的文件上传界面图像是上传PHP文件到服务器的一种方式。 - Fandi Susanto

6
它会极大地增加您的网站受到恶意活动攻击的风险,因为只需要破解一个帐户即可。任何获得任何登录凭据的人都可以对您的页面做任何想做的事情,包括更改它们以显示“此网站非常不安全,请给我您的信用卡信息”。
编辑:(澄清和回应评论) 许多服务器具有多种用途。它们运行多个服务。如果您通过为每个服务分配唯一的用户并相应地管理文件权限来仔细隔离这些服务,则是的,如果有人危害了帐户的凭据,您仍处于热水中,但他们可以造成的伤害仅限于该服务。如果您只有一个通用帐户,并将整个文件系统设置为777,则一个被入侵的帐户会危及机器上的所有内容。
如果您的服务器专门用于仅运行Apache / PHP并且没有其他用途,并且仅有一个帐户在其中运行Apache / PHP,则在应用程序的角度看,该一个帐户的被危害与整个计算机的被危害程度相同。(虽然您仍应使用管理员帐户/根来保护系统文件并使其不可写)。
如果他们可以编写一个文件,并且该文件是可执行的,则可以将其更改为在您的机器上执行的某个东西(可执行文件或脚本),然后使用PHP的shell_exec运行该可执行文件。如果您未配置不允许shell_exec,则他们也可以更改您的配置。

@Eric J使用什么样的登录方式获得了我的系统访问权限?是shell登录吗?如果外部人员能够访问我的Linux服务器上的shell,那么我很可能已经遭受了损失。chmod 777就是这些吗? - Pekka
@Eric J:虽然有效,但如果有人拥有机器的shell访问权限,难道不比某个随意chmod 777的目录更紧迫吗? - jasonbar
@Eric J,我特别询问执行位。为什么在安全方面,我的网站内容是否被标记为可执行很重要,即使它们不是可执行二进制文件?这就是我想了解的。 - Pekka
@Pekka:如果你一贯地应用最小访问原则,你会有专门用于特定目的的帐户,并将这些帐户限制在与该目的相关的文件上。如果您的服务器唯一的目的是运行PHP,则只有一个此类帐户,则其影响较小,而如果您在同一台计算机上运行多个服务,则每个服务都有专门的帐户,并且每个帐户都限制访问与该服务相关的文件。 - Eric J.
@Eric J. 我完全同意。我在这里的问题是关于“7”位,因为我看到有人的(基于PHP的)网站被入侵,其他人回答说:“嗯,你在这里和那里都设置了chmod 777,难怪你会被黑客攻击。”我想要了解具体的原因 - 应用最小权限是唯一可行的方式是毋庸置疑的。 - Pekka
@Pekka:如果他们可以编写你的文件,并且它是可执行的,他们可以将其更改为在你的机器上执行的某些内容(可执行文件或脚本),然后使用PHP的shell_exec来运行该可执行文件。如果你的配置不允许shell_exec,他们也可以更改你的配置。 - Eric J.

3
在处理权限方面遵循极简主义有许多好的通用理由,但在LAMP webhost的情况下,马上想到的几个原因是:
- 在共享托管平台上,共享您主机的其他用户现在可以读取和写入您的脚本。 - 在专用主机上,流氓进程可以读/写并意外删除您的文件。假设后台作为用户nobody运行的自定义日志记录过程存在错误,导致其尝试`rm -rf /`。一般来说,这是无害的,因为几乎没有什么文件是nobody应该具有写入权限的,但是这个流氓进程现在会将您的文件带走。 - 要破坏您的网站,只需以任何用户的身份登录即可,甚至可以使用dummy账户(例如nobody)。一般来说,攻击者必须进行更进一步的用户级别提升攻击,才能到达可以造成一些损害的地方。这是一个真正的威胁。一些非关键服务可能正在使用dummy账户运行,并可能包含漏洞。

1
假设您的服务器安装了一个软件包,并存在一个零日漏洞,攻击者获得了访问您的管理控制面板并具有上传文件功能的权限。如果您将所有内容设置为777,则他可以轻松地在任何地方上传一个shell脚本。然而,如果您正确设置权限,他就无法这样做,因为 nobody/www-data/etc 没有写入权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接