【问题标题】:CHMOD and the security for the directories on my serverCHMOD 和我服务器上目录的安全性
【发布时间】:2009-02-26 02:22:58
【问题描述】:

我的服务器上有一个文件夹,我已将其权限更改为 777(读取、写入和执行全部),以允许用户上传他们的图片。

所以我想知道,这涉及到哪些安全风险?

我已经实现了代码来限制可以上传的文件格式,但是如果有人找到目录的位置会发生什么,这会对我的服务器造成任何威胁吗?

他们可以开始上传他们想要的任何文件吗?

谢谢。

【问题讨论】:

  • 如果没有更多信息,这个问题是无法回答的。例如,文件实际上是如何上传的?您的代码本身可能有足够多的问题,上传目录的权限是您最不必担心的。
  • 感谢您对我的编码持批评态度,但它并没有真正回答问题。这些文件将通过在 php 页面中创建的表单上传。问题的关键是要找出保留一个具有 777 权限的目录集是否安全?
  • 用该信息更新问题
  • +1 表示询问。有了这些东西,问题并不明显,因为没有错误消息或程序崩溃。

标签: security sysadmin chmod


【解决方案1】:

当用户通过 web 表单和一些 PHP 脚本将文件上传到您的服务器时,服务器上的磁盘访问发生在 web 服务器运行的用户 ID 下(通常是nobody、www-data、apache、_httpd 甚至根)。

请注意,无论是哪个用户上传文件,都会使用此单个用户 ID

只要没有本地用户通过其他方式(例如ssh)访问系统,将上传目录权限设置为0777 不会有太大的不同——除非有人利用安全性系统中其他地方的漏洞无论如何都没有这些权限适用于任何人,这样的攻击者可能只会使用/tmp

最好只对文件或目录设置实际需要的权限。在这种情况下,这可能意味着:

drwxrws--- 5 www-data www-data          4096 Nov 17 16:44 upload/

我假设除了网络服务器之外的其他本地用户也想要访问这些文件,比如系统管理员或网页设计师。将这些用户添加到运行 Web 服务器的组中,他们不需要 sudo 或 root 权限即可访问该目录。此外,+s 意味着upload/ 中的新文件和目录将自动归同一组所有。

关于你的最后一个问题:攻击者知道目录在哪里,并不意味着他可以神奇地使文件出现在那里。仍然必须运行某种服务来接受文件并将它们存储在那里......所以不,将权限设置为0777 并不会直接降低安全性。

不过,在整个设置中,您无法通过文件权限解决“安全性”和“安全性”的更多维度:

  • 上传者仍然可以覆盖彼此的文件,因为它们都使用相同的用户 ID
  • 有人可以将恶意 PHP 脚本上传到上传目录并从那里运行,可能会利用您系统上的其他漏洞并获得 root 访问权限
  • 有人可以使用您的服务器分发儿童色情内容
  • 上传与 paypal.com 相似的网站后,有人可能会从您的服务器运行钓鱼网站

...而且可能还有更多。您可能已经在上传脚本中解决了其中一些问题,但话又说回来,在了解安全问题时,通常一开始就对 unix 文件权限及其应用位置的理解很重要,这表明您可能还没有准备好解决所有问题可能出现的问题。

有人看过你的代码!

【讨论】:

  • 感谢您的精彩帖子,我今年 19 岁,只编写 PHP 9 个月 - 我并不想以此为借口,我只是从未真正了解安全性的程度去了,但它比我想象的要大得多。谢谢,我还有很多研究要做!
  • ooo 还有一件事,关于用户上传恶意 php 文件。你知道有什么好的方法可以防止这种情况吗?确实会非常有帮助!再次感谢。
  • 在另一个问题中提出这个问题,参考这个问题,我会尽力回答。您可以采取一些措施来避免麻烦。
【解决方案2】:

这些用户通过什么方式上传他们的图片?如果是通过网络,那么您只需要授予网络服务器或 CGI 脚本用户访问该文件夹的权限。

这里最大的危险是用户可以覆盖其他用户的文件,或者删除其他用户的文件。没有访问此文件夹的任何人都无法写入(除非您有某种来宾/匿名用户)。

如果你需要一个每个人都可以在其中创建文件的目录,你想要的是模仿 /tmp 目录的权限。

$ chown root:root 目录; chmod 777 目录; chmod +t 目录;

这样任何用户都可以创建文件,但不能删除其他用户拥有的文件。

与其他人所说的相反,unix 系统中目录上的可执行位意味着您可以将该目录设置为当前目录(cd 到它)。它与执行无关(执行一个目录是没有意义的)。如果您删除可执行位,则没有人可以“cd”到它。

【讨论】:

  • 我知道如果 dir 是 -x,chdir() 会因 EACCES 而失败。它可能控制其他东西?
  • 感谢您的回复。用户将通过 php 文档中的表单上传。当您说无法访问此文件夹时,理论上任何在我的网站上拥有帐户的人都可以访问那里上传图片?谁属于访客/匿名用户类别?感谢您的帮助
  • @eben,它基本上控制了查看目录“文件”内部的能力,因此“cd dir”将失败。 “find dir -print”也不起作用,或者“ls dir/*”。如果您知道它们的名称(例如“cat dir/known_file”),您仍然可以访问这些文件
  • @Pax:不完全;您需要对目录具有 x 权限才能访问文件;您需要对目录具有 r 权限才能读取该目录(例如,使用 'ls' 列出文件)。你是对的,如果你知道名字,你只需要目录的 x 权限和文件的名称/权限。
  • 对不起,@JL,你是对的。 R 使您能够读取目录,您仍然需要 X 才能获取其中的文件。
【解决方案3】:

如果没有别的,我会删除所有用户的可执行权限(如果不是所有者和组)。启用此功能后,有人可以上传看起来像图片但实际上是可执行文件的文件,这可能会造成无休止的损坏。

除非您需要匿名访问,否则可能还删除所有用户的读写权限并将其限制为所有者和组。

【讨论】:

  • 嗨 samoz,感谢您的回复。当它说用户/组然后是每个人时 - 谁属于哪个组?我假设我是所有者?
  • 目录上的 eXecutable 标志与将可执行文件伪装成图像有什么关系?
  • 还有可执行文件是什么意思,比如执行程序?
  • 可执行标志决定你是否可以执行代码。如果此标志关闭,即使您将可执行文件伪装成映像,也无法运行它,这是理想的。
  • a) 这不是真的。即使没有 +x 也有执行代码的技巧; b) 我们谈论的是目录的权限,而不是文件。
【解决方案4】:

您不想打开可执行位。就 *nix 而言,可执行位意味着您可以实际运行该文件。因此,例如,php 脚本可以上传为 JPEG 类型,然后如果有人知道位置并且它在 web 目录中,则可以运行该脚本。

【讨论】:

  • 文件夹权限为 777 - 不一定是文件权限。我同意,文件一般不需要执行;文件夹的作用就像没有执行(搜索)权限一样,您无法访问其中的文件。
猜你喜欢
  • 2012-09-09
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2012-10-17
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多