777 意味着系统上的任何用户(无论如何都对所有父目录具有执行访问权限)可以向该目录添加任何内容。但是,Web 用户不是系统用户,并且大多数 Web 服务器(包括 Apache)不会让随机客户端直接在其中写入文件。你必须明确告诉服务器允许这样做,我相当肯定这不是发生的事情。
但是,如果您允许任何文件上传,则上传文件夹至少需要 Web 服务器的用户(或网站的用户,如果您使用类似 suPHP 的话)是可写的。如果 Web 服务器可以写入该目录,那么任何 PHP 代码都可以写入该目录。您不能将权限设置得足够高以允许上传,也不能将权限设置得足够低以阻止 PHP 代码运行,除非使目录只写(这使得它对 fckeditor 等非常无用)。
几乎可以肯定,由于站点本身存在漏洞,因此发生了妥协。可能是文件上传脚本没有正确检查写入的位置,或者脚本盲目地接受要包含的内容的名称。由于 PHP 代码通常以 Web 服务器的用户身份运行,因此它对 Web 服务器具有写访问权限的所有内容具有写访问权限。(也有可能有人通过 FTP 进入,在这种情况下,您最好更改密码。但网络服务器出错的可能性充其量是微乎其微的。)
至于此时该做什么,最好的选择是擦除站点并从备份中恢复——正如多次提到的那样,一旦攻击者获得了在您的服务器上运行的任意代码,就不会有很多你可以再信任了。如果你不能这样做,至少找到任何具有最近修改时间的文件并删除它们。(漏洞利用几乎从来没有经历过那么大的麻烦来掩盖他们的踪迹。)
无论哪种方式,然后设置任何非上传,非临时,非会话目录的权限 - 以及所有现有脚本 - 以禁止写入,期间......特别是Web服务器。如果站点的代码以拥有文件的同一用户身份运行,您将希望将 555 用于目录,将 444 用于文件;否则,您可能可以使用 755/644。(Web 服务器只有在配置严重错误的情况下才能编写这些内容,而无能的托管公司很快就会倒闭。)
不过,坦率地说,“支持人员”的想法是正确的——我当然不会让一个站点在我的服务器上运行,因为我知道它将执行来自陌生人的任意代码。(即使它不能向本地文件系统写入任何内容,它仍然可以用来对其他服务器发起攻击。)目前最好的选择是暂时删除所有上传文件的能力。很明显,有人不知道如何安全地处理文件上传,现在有人知道你很脆弱,你很可能会一直被黑客入侵,直到你找到漏洞并堵住它。
至于要寻找什么......不幸的是,它是半模糊的,因为我们正在谈论单语句级别之上的概念。查找以任何方式从 $_GET、$_POST 或 $_COOKIE 派生的文件名中写入、或写入include
的任何 PHP 脚本。require