压缩包文件上传威胁二三事

最近某小伙伴的一个系统需要这样一个功能,压缩包上传之后先进行解压,经过处理之后再压缩,然后新的压缩包提供给用户下载。而在这个上传功能点的地方,除了平常文件后缀、文件名等常规检测,我们还遇到了其他的一些安全问题。这里会给大家分享一下。

代码执行

由解压缩程序的漏洞所引起的代码执行是一个很显而易见的问题。比如:

  • CVE-2016-2334    7zip中的堆溢出引起的远程命令执行
  • CVE-2018-20250 WinRAR中目录穿越引起的远程命令执行

等等。这里就不详细说了。

ZIP BOMB

比如说著名的42.zip、droste.zip、zbxl.zip 等等。这些ZIP包在解压缩的时候会变得无比巨大,造成溢出或者OOM的问题。

为了防御这种攻击,通常可以预先给解压文件设定一个内存大小,当超过设定值之后就直接取消。

目录穿越

压缩包中的文件是“../../../../../xxx”的形式,在解压的时候有可能造成目录穿越。

当然,好消息是,目前linux常用的命令tar、unzip等都会过滤或者报错“../”符号。所以这个问题经常出现在集成或者自己写的解压缩库中。

举个例子:

https://github.com/ptoomey3/evilarc/blob/master/evilarc.py

使用这个脚本可以生成上面所说的那种压缩包文件。

同时写了一个Java程序,这个程序使用java.util的ZipInputStream来完成解压的操作。当然在使用ZipEntry在进行目录读取或者创建的时候是没有进行检测的。可以参考这个 https://www.cnblogs.com/ll409546297/p/9340129.html上面的代码。

设置好输入输出。

编译并执行,可以看到压缩包中的文件被放入 /etc 目录下了。当然由于权限原因,这里用 sudo权限来执行Java程序。

软链接

可以看到之前提到的功能还包括了解压后再次压缩文件然后提供下载,所以还会遇到压缩包中由软连接的问题。

同样举个例子:

创建文件,并创建其软链接。

使用zip -y命令来将软链接压缩。

然后在另外一台机器上进行解压,这个时候机器上同目录下,同样有1这个文件。

压缩文件,但是这个时候使用的是zip命令。

可以看到压缩进去的直接就是源文件了。

针对这个问题,可以检查解压出来的文件,或者在压缩的时候同样使用zip -y的命令。

 

References

https://www.cnblogs.com/ll409546297/p/9340129.html

https://github.com/ptoomey3/evilarc/blob/master/evilarc.py

本文原创,作者:shaozhuang,其版权均为Galaxy Lab所有。如需转载,请注明出处:http://galaxylab.pingan.com.cn/%e5%8e%8b%e7%bc%a9%e5%8c%85%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%a8%81%e8%83%81%e4%ba%8c%e4%b8%89%e4%ba%8b/

发表评论

*