PHP安全问题-文件上传


php security issue - file uploads

我的一个客户找我检查和修复被黑的网站。网站是由另一个开发人员开发的,非常没有经验的开发人员,甚至没有基本的安全措施。

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

我有几个问题:

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

我要求支持人员更改文件夹权限,这将解决这个问题,但他说有一些PHP文件通过其他PHP文件编写,他希望这是固定的,否则网站不能运行。他说,即使文件夹权限被更改,黑客也可以再次将其更改为777,并执行他想要的任何内容,因为这个写得很差的PHP文件。

我的方法应该如何找到如果有这样的PHP文件?如有任何帮助或指示,将不胜感激。

777意味着系统上的任何用户(无论如何,对所有父目录具有执行访问权限)都可以向该目录添加任何内容。但是,Web用户不是系统用户,而且大多数Web服务器(包括Apache)不会让随机客户机开箱即用地在那里写入文件。你必须明确地告诉服务器允许这样做,我很确定这不是发生的事情。

如果你允许任何文件上传,上传文件夹至少需要被web服务器的用户(或者站点的用户,如果你使用suPHP之类的东西)可写。如果web服务器可以写入该目录,那么任何PHP代码都可以写入该目录。您不能设置足够高的权限来允许上传,而设置足够低的权限来阻止PHP代码运行,除非将目录设置为仅写(这对于fckeditor等来说非常无用)。

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

至于此时该怎么做,最好的选择是清除站点并从备份中恢复——正如已经提到过几次的那样,一旦攻击者在您的服务器上运行任意代码,您就再也没有什么可信任的了。如果不能这样做,至少找到最近修改过的文件并删除它们。(黑客几乎从不费那么大的劲来掩盖他们的踪迹。)

无论哪种方式,然后设置任何非上传、非临时、非会话目录的权限——以及所有现有的脚本——禁止写,句号…特别是通过web服务器。如果站点的代码以拥有文件的同一用户运行,则需要使用555表示目录,444表示文件;否则,你可以用755/644。(web服务器只有在配置严重错误的情况下才能编写这些内容,而不合格的托管公司将很快破产)

坦率地说,尽管,"支持家伙"有正确的想法——我当然不会让一个网站在我的服务器上运行,知道它将执行来自陌生人的任意代码。(即使它不能向本地文件系统写入任何内容,它仍然可以用来对其他服务器发起攻击。)目前最好的选择是删除所有上传文件的功能。很明显,有人不知道如何安全地处理文件上传,现在有人知道你是脆弱的,你很可能会继续被黑客攻击,直到你找到这个漏洞并堵住它。

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

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

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

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

一旦你准备好了备份文件,删除你网站上的所有东西并上传备份——如果是共享主机,你也应该联系他们,以防其他文件被泄露[虽然很少发生]。

您已经确定了两个问题:权限和缺乏扩展检查,但是您是否有任何证据表明这些是系统被破坏的手段?您没有提供任何东西来支持这个断言。

将权限更改为更严格的权限将提供NO保护防止用户上传恶意PHP脚本。

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

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

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

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

在web服务器的文档根目录中写入文件肯定有多种可能的方法。想想HTTP的PUT方法,WebDAV,甚至FTP都可以匿名访问。

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

在验证上传的文件时,有很多事情可能会出错。相信客户提供的信息的可靠性是一个人可能犯的最大错误之一。这意味着,检查客户端是否说上传的文件是一个图像(例如image/…之一)是不够的。这样的信息很容易伪造。即使是正确的图像文件也可以包含PHP代码,这些代码在PHP解释时被执行,无论是在可选部分(如注释部分)还是在图像数据本身中。

将文件夹权限设置为较低级别不能解决问题吗?

不,可能不会。上传目录必须是PHP可写的,web服务器进程可读的。由于两者可能是相同的,并且执行PHP文件只需要读取权限,因此任何上传的.php文件也可能是可执行的。唯一的解决方案是确保存储的文件没有任何扩展名,即表示由web服务器执行的文件,即确保PNG实际上存储为.png