PHP ZipArchive的潜在安全问题

时间:2011-07-12 15:47:34

标签: php zip

我想允许成员选择使用zip文件上传内容。上传后,我想使用PHP的ZipArchive类将zip文件内容解压缩到一个目录,然后将文件移动到我们的系统中。

我担心潜在的安全风险,我在php.net上找不到任何文档。想到的第一个(好的,唯一的)风险是有人创建一个zip文件,其相对路径如“../../etc/passwd”(如果他们假设我在/ tmp / somedir中解压缩文件)。

我实际上很难在zip文件中创建相对路径,所以我无法测试这样的事情是否可行。我也找不到任何方法来使用ZipArchive提取zip文件的内容,并让它忽略目录(解压缩所有文件,但不要在zip中创建目录结构)。

有人可以告诉我这样的漏洞是否可行,和/或如何使用ZipArchive忽略zip文件中的目录结构?

4 个答案:

答案 0 :(得分:3)

我有同样的担忧,看看我发现的PHP 5.3源代码:

/* Clean/normlize the path and then transform any path (absolute or relative)
         to a path relative to cwd (../../mydir/foo.txt > mydir/foo.txt)
 */
virtual_file_ex(&new_state, file, NULL, CWD_EXPAND TSRMLS_CC);
path_cleaned =  php_zip_make_relative_path(new_state.cwd, new_state.cwd_length);
if(!path_cleaned) {
    return 0;
}

对我来说很好看。 Checkout PHP并查看./ext/zip/php_zip.c了解详情。

答案 1 :(得分:2)

有趣的问题,但我恳请你以不同的方式解决这个问题。我强烈建议您在chroot监狱中以最少的权限运行您的Web进程。假设你这样做,可能发生的最糟糕的事情是你的网站被破坏,然后你恢复备份并做一些取证来插入特定的漏洞。 不断发现新的漏洞,你将很难完全保护你的网站在这样的预感之后。最大限度地减少攻击者的沙箱确实有很长的路要走。

答案 2 :(得分:1)

您需要确保应用程序服务器不直接提供提取的内容。因此,如果有人在他的档案中有一个php文件,他就无法通过你的网络服务器执行它。

另一件事是你应该保护自己不被包含在用户生成的内容中。但是,如果没有zip存档,也应该考虑这一点。

答案 3 :(得分:0)

最后,我将使用Pekka的解决方案,使用命令行解压缩实用程序。它提供了忽略zip文件中目录的开关。其他人所指出的担忧在这里不是问题。解压缩文件后,我们使用与常规上传相同的过程将它们添加到系统中,这意味着使用我们已有的安全措施仔细检查每个文件。