php安全问题 - 文件上传

时间:2013-02-28 14:48:15

标签: php security

我的客户接近我检查并修复被黑网站。网站是由另一个开发人员开发的,非常缺乏经验的开发人员甚至没有基本的安全保护。

问题是某种程度上PHP文件被写入images文件夹。黑客还写了一个index.html,显示网站被黑客入侵。当我检查图像文件夹有777权限。所以我得出了粗略的结论,因为它的文件夹权限。托管支持人员说,某些PHP文件编写的脚本写得不好,允许任何扩展文件上传到服务器,然后黑客执行文件以获取访问权限或做任何他们想做的事情。

我几乎没有问题:

  • 是否只能通过上传功能上传其他PHP文件? 是否有可能以其他方式从远程写入文件,因为文件夹权限是777?
  • Sit有一些fckeditor编辑器和几个上传功能。我检查了它们,有足够的验证,所以当其他扩展,然后尝试上传图片或PDF时,它们只会返回false。
  • 是否将文件夹权限设置为较低级别可以解决问题?

我请求支持人员更改文件夹权限,它可以解决问题,但他说有一些PHP文件通过其他PHP文件编写,他希望修复,否则网站无法上线。他说即使文件夹权限被更改,黑客也可以再次将它们更改为777并执行他想要的任何内容,因为编写的PHP文件很糟糕。

我的方法应该如何找到是否有这样的PHP文件?任何帮助或指示将非常感激。

5 个答案:

答案 0 :(得分:2)

777表示系统上的任何用户(对所有父目录都具有执行权限)可以向该目录添加任何内容。但是,Web用户不是系统用户,大多数Web服务器(包括Apache)都不会让随机客户端直接在那里写文件。你必须明确地告诉服务器允许这样做,而且我很确定那不是发生了什么。

如果您允许任何文件上传,则上传文件夹至少需要由Web服务器的用户(或者如果您使用suPHP之类的网站的用户)写入。如果Web服务器可以写入该目录,那么任何PHP代码都可以写入该目录。您无法将权限设置得足够高,以允许上传足够低以防止PHP代码运行,而不是使目录只写(这使得它对fckeditor等无用)。

由于网站本身存在漏洞,因此几乎肯定会发生这种妥协。有可能是文件上传脚本没有正确地检查它写入的位置,或者是盲目接受要包含的内容名称的脚本。由于PHP代码通常作为Web服务器的用户运行,因此它具有对Web服务器具有写访问权限的所有内容的写访问权。 (也有可能有人通过FTP进入,在这种情况下你最好更改你的密码。但是网络服务器出错的可能性很小。)

至于此时要做什么,最好的选择是擦除网站并从备份恢复 - 正如已经提到的那样,一旦攻击者获得了在您的服务器上运行的任意代码,就没有了你可以信任的很多东西。如果您不能这样做,至少找到具有最近修改时间的任何文件并删除它们。 (漏洞利用几乎没有经过那么多麻烦来掩盖他们的踪迹。)

无论哪种方式,然后在任何非上传,非临时,非会话目录和所有现有脚本上设置权限,以禁止写入,期间...特别是网络服务器。如果站点的代码作为拥有文件的同一用户运行,那么您将需要使用555作为目录,使用444作为文件;否则,你可能会得到755/644。 (如果网络服务器的配置错误,那么它只能编写那些服务器,并且一个不称职的托管公司会很快失去业务非常

坦率地说,“支持人员”有正确的想法 - 我当然不会让我的服务器上的网站知道它会从陌生人那里执行任意代码。 (即使它无法向本地文件系统写入任何内容,它仍然可以用于对其他服务器发起攻击。)现在最好的选择是删除所有上传文件的能力。很明显,有人不知道如何安全地处理文件上传,现在有人知道你很容易受到攻击,你可能会一直被黑客攻击,直到找到漏洞并插上它为止。

至于要寻找什么...不幸的是,它是半模糊的,因为我们正在讨论单一陈述级别以上的概念。查找includerequire或以任何方式从$ _GET,$ _POST或$ _COOKIE派生的文件名写入的任何PHP脚本。

答案 1 :(得分:1)

除非您使用CGI,否则更改文件夹权限不会解决问题,因为PHP可能需要能够写入上传文件夹,并且您的Web服务器可能需要能够从中读取。检查所有上传文件的扩展名!

(所以不,0777权限并不意味着任何人都可以上传任何内容。)

答案 2 :(得分:1)

正如神秘提到的,一旦黑客可以在您的服务器上运行代码,那么您必须假设所有文件都有潜在危险。您不应该尝试自己修复此问题 - 从备份(从客户端或原始开发人员)恢复是解决此问题的唯一安全方法。

准备好备份文件后,删除您网站上的所有内容并上传备份 - 如果它是共享主机,您应该联系他们以防其他文件被泄露[尽管很少发生]。

答案 3 :(得分:1)

您已经确定了两个问题:权限和缺少扩展程序检查但是您是否有证据表明这些是系统遭到入侵的方式?你没有提供任何支持这个断言的东西。

将权限更改为更具限制性的内容会为上传恶意PHP脚本的用户提供无保护

检查文件扩展名可能会使PHP代码注入网站变得更加困难,不会阻止它

从备份中恢复可能会删除代码中的破坏内容,但不会修复漏洞

您没有技能,您的客户(可能为此付钱给您)需要解决此问题。获得这些技能比在这里阅读一些答案要长得多(尽管这是一个开始)。

答案 4 :(得分:1)

  

是否只能通过上传功能上传其他PHP文件?是否有可能以其他方式从远程写入文件,因为文件夹权限是777?

在Web服务器的文档根目录中编写文件肯定有多种可能的方法。只需考虑HTTP的PUT方法,WebDAV,甚至可以匿名访问的FTP。

  

Sit有一些fckeditor编辑器和几个上传功能。我检查了它们,有足够的验证,所以当其他扩展,然后尝试上传图片或PDF时,它们只会返回false。

验证上传的文件时,有很多事情可以做错。信任客户发送的信息的可靠性是人们可以做的最大错误之一。这意味着,检查客户端是否说上传的文件是图像(例如image/…之一)是不够的。这些信息很容易伪造。甚至在PHP解释时执行的proper image files can contain PHP code,无论是在评论部分的可选部分还是在图像数据本身中。

  

没有将文件夹权限设置为较低级别可以解决问题吗?

不,可能不是。上传目录必须是PHP可写的,并且可由Web服务器进程读取。由于两者可能相同且executing a PHP file requires only reading permissions,因此任何上传的.php文件都可能是可执行的。唯一的解决方案是确保存储的文件没有任何表示Web服务器执行的文件的扩展名,即确保PNG实际存储为.png