安全问题?

3

我正在编写一个小型的PHP应用程序,不确定是否存在安全问题。以下是该应用程序的功能:

  • 用户可以上传图片文件(png、gif、jpg、jpeg、tiff和其他一些格式)或zip文件

我检查mime类型和扩展名,如果不允许上传,则不允许上传(这不是我担心的部分)。

现在,一旦上传完成,我将文件重命名为唯一的哈希值并存储在根目录之外的文件夹中。

用户现在可以通过短URL访问该文件。我设置正确的mime类型来使文件可访问,并使用readfile()函数读取。

我的问题是:是否会在图像文件中包含jar文件的漏洞同样适用于此处?我将图像作为纯图像呈现。

如果确实有此漏洞,如何防范?

谢谢。


"压缩文件",您会解压缩文件并测试(甚至保存)存档中包含的每个图像吗? - VolkerK
不行,zip文件是强制下载的...我在浏览器中显示的唯一内容是图像,但始终作为真实图像或在图像标签内部显示... - mistero
顺便提一下,我最大的担忧是自己服务器的安全性,而不是第三方用户打开那张图片的安全性... - mistero
5个回答

5

MIME类型检查无法解决GIFAR问题。2009年的JRE已经修补过了,但如果您想解决这个问题,可以选择:

  • 从不同的域名提供您的图像
  • 运行服务器端代码来检查图像是否包含有效的JAR,如此处所述

除此之外(除非拒绝向任何具有足够旧的JRE的Java启用浏览器提供文件),其他任何方法都可能在特定情况下失败。

还要记住,要使用此技术进行有效攻击,您的服务器基础设施必须相当开放(请求来自同一域并不意味着您应该提供它要求的任何信息)。


+1 谢谢。似乎有些人从未听说过这种漏洞。 - Byron Whitlock
MIME类型由客户端浏览器报告->它可以很容易地被伪造。 - Jacco

1

仅检查MIME类型是不够的,因为任何HTTP头字段都可以被伪造。确认文件是否为有效图像的最佳方法是尝试以编程方式读取它作为图像。如果它可以被解析为图像,则可以相当有信心地认为它不是恶意代码。


这个jar漏洞实际上会生成一个真实的图像,可以在任何图像查看器中验证。 - Byron Whitlock
在这种情况下,调整图像大小(你可能最终会这样做)就可以相对安全了。 - Asaph
我无法调整图像大小。我需要它作为原始图像。如果我稍后尝试将文件输出为图像,这是否会成为问题?我不会在如何查看图像方面给予任何自由... - mistero
调整大小是一种新颖的方法。好主意! - Byron Whitlock
2
调整大小无法针对GIFAR进行操作:http://securityandthe.net/2008/08/04/even-more-gifar-details/ - oggy
显示剩余2条评论

1

相关:确保上传的文件是安全的

任何隐藏的漏洞都不应该影响服务器,因为您处理它的方式。您只是存储二进制信息,并检索二进制信息,而不以任何方式处理它。试图显示被利用内容的浏览器可能面临风险,但标准图像类型相当安全。

如果您想更安全,可以在每个上传的文件上运行反病毒软件。如果您使用*nix平台,则可以使用业界标准ClamAV

我更担心有人尝试上传非常大的图像文件。


我也在检查文件大小。不过感谢你指出来。 - mistero
对于Windows用户,还有另一个优秀的产品ClamWin。 - NotMe

0
你可以做两件事情。从images.domain.com提供您的图像。这必须在另一个物理/虚拟服务器上,或者通过防火墙进行保护,以便该域名无法访问服务器上的任何开放端口。
或者,您可以通过像here这样的Java脚本运行图像文件。这将告诉您图像中是否嵌入了jar文件。
有关此问题的更多信息,请参见此处:

http://www.gnucitizen.org/blog/java-jar-attacks-and-features/


如果整个目的是使URL变得更短,那么我怎样才能通过另一个域名来为它们提供服务呢?我需要使用readfile()函数...我可以在我的服务器上禁用JAR执行,对吧? - mistero

0

我之前甚至都没有听说过这次攻击,所以首先要感谢你让我知道了!通过搜索,似乎有基本上两种不同的攻击方式。这两种攻击方式都涉及攻击者引诱“常规”用户访问指向冒充 JAR 文件的恶意站点,并且都与该 JAR 在您网站的“上下文”中执行有关(即源将是您的网站)。

第一种攻击与小程序能够读取用户 cookie 有关,这基本上意味着它将能够窃取用户登录您域名的信息。

第二个攻击与小程序现在被允许在您的域内打开其他套接字连接有关,如果您服务器防火墙后面的用户访问了恶意页面,则非常危险(使攻击者能够有效地绕过您的防火墙)。

因此,这种攻击不一定会直接损害您的服务器,但它确实会损害您的用户 - 希望您关心您的用户。您可以做的两件事情已经在大多数其他答案中提到,并在 this page 中概述。


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