zip解压炸弹

在文章的开头,让我们先来介绍一下zip解压炸弹是个 什么妖怪!

解压炸弹是指解压缩后能够产生巨大的数据量的可疑压缩文件!默认设置是文件扫描中产生500MB以上解压数据的是“解压炸弹”,实时监控中是100MB,邮件监控是30MB。这样的压缩文件解压缩可能对解压程序造成严重负担或崩溃(可能用来攻击压缩软件以及占用大量电脑资源,或者杀毒软件的解压缩功能)。解压炸弹内,还可能存在病毒,解压中会自启动窃取用户信息

如何制作解压炸弹

 42.zip 是很有名的zip炸弹。一个42KB的文件,解压完其实是个4.5PB的“炸弹”。zip炸弹文件中有大量刻意重复的数据,这种重复数据在压缩的时候是可以被丢弃的,这也就是压缩后的文件其实并不大的原因。这一百多万个最终文件,每个大小为 4.3 GB 。因此整个解压过程结束以后,会得到 1048576 * 4.6 GB = 4508876.8 GB 也就是 4508876.8 ÷ 1024 ÷ 1024 = 4.5 PB 这需要特殊的压缩算法和工具,但我们可以通过Python做一个简单的zip解压炸弹:

# -*- coding: utf-8 -*-
import osdef make_boom(file_path, file_num, string_len):if not os.path.exists(file_path):os.mkdir(file_path)os.chdir(file_path)for i in range(file_num):with open('boom%d.txt' % i, 'w',encoding='utf-8') as f:f.write('Boom' * string_len)make_boom('zip_boom', 1000, 1000 * 1000)

我们快速创建1000个boom文件,每个文件中写入了一百万个boom,制作出了一个3.72GB的文件夹,然后只用7z工具的极限压缩效果,最终得到的zip文件只有4.8MB。

开始捣乱

我们自己制作的zip解压炸弹准备完毕,现在我们要找地方去黑别人的服务器了。找谁呢?刚好最近报了一个网易云课堂的Java微专业,他们每次提交打压的时候都是上传zip文件,然后老师获取到文件后解压进行批改,如图:现在只要我提交附件,就可以静等批改作业的老师,把我按在地上摩擦了。(当然我肯定不会提交的...)这么大的一个网站,居然都没有对zip解压炸弹进行上传检查,可见大家日常开发过程中,存在多么大的安全隐患啊!

常规校验

正如刚才拿网易云课堂进行的上传演示,日常开发中我们对压缩文件的校验,主要分为类型、大小的校验。比如我们Flask开发时,会通过flask_wtf校验文件类型:

from flask_wtf.file import FileField, \FileRequired, FileAllowed
allow_type = ['zip', 'rar', '7z']class UploadForm(FlaskForm):zip_file = FileField('请上传文件:',validators=[FileRequired(),FileAllowed(allow_type)])submit = SubmitField()

同样的,会通过设置Flask最大文本长度对上传文件的大小进行校验

from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'Breeze Python'
app.config['UPLOAD_PATH'] = os.path.join(app.root_path, 'uploads')
app.config['MAX_CONTENT_LENGTH'] = 30 * 1024 * 1024  # 30Mb

或者在文件读写过程中,通过 os.path.getsize(filePath) 来校验文件大小。但如果你只做了如上方式,那么恭喜你一大波zip解压炸弹正向你赶来...

正确的方式

那么,我们可以通过什么方式来对zip解压炸弹进行预防呢?其实很简单:

  1. 文件数量

  2. 动态解析文件总大小

先上代码看看:

# -*- coding: utf-8 -*-
# @微信号   : King_Uranus
# @公众号    : 清风Python
# @GitHub   : https://github.com/BreezePython
# @Date     : 2020/09/08 23:30:33
# @File     : zip_boom.py
import zipfile
import osdef unzip(filename: str):# 限制最大文件数100max_file_num = 100# 设置解压内容最大值(一般平均最大的压缩率20,再高就很可能是异常文件了!)max_file_size = 1024 * 1024 * 100 * 20total_size = 0to_zip_file = zipfile.ZipFile(filename)dirname = filename.replace('.zip', '')# 校验文件总数量if len(to_zip_file.filelist) > max_file_num:raise ValueError("压缩文件的数量超过了上限")# 校验解压文件内容最大值for file in to_zip_file.filelist:total_size += file.file_sizeif total_size > max_file_size:raise IOError("压缩包内容异常")# 判断文件夹重复则退出if os.path.exists(dirname):print(f'{dirname} dir has already existed')return -1else:# 创建文件夹,并解压os.mkdir(dirname)to_zip_file.extractall(dirname)to_zip_file.close()unzip('zip_boom.zip')

比如刚才的网易云课堂,学生做的解题答案,一个类加几个依赖文件了不起了。所以我们通过设置压缩包最大解压文件数进行检测。我们再设置原始文件的最大内存上限(一般平均最大的压缩率不会超过20,再高就很可能是异常文件了!),起到二次校验的作用,最终达到zip解压炸弹的安全防护。日常开发过程中,软件的安全、可信要时刻放在首要位置。

请牢记,今天偷的懒,就是明天流的泪啊!

惊爆:当Python代码遇到zip解压炸弹,未做防护的你后悔莫及!相关推荐

  1. Python 标准库 —— 文件解压(zip、gz、pkl、tar)

    Python模块学习:zipfile zip文件操作 Python 学习入门(16)-- zipfile 1. zip ⇒ zipfile with zipfile.ZipFile('../data/ ...

  2. linux 下tar怎样解压zip文件,linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)...

    简介这篇文章主要介绍了linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)以及相关的经验技巧,文章约6037字,浏览量504,点赞数7,值得推荐! .tar 解包:ta ...

  3. python 图像压缩后前端解压_Python在后台自动解压各种压缩文件的实现方法

    1.需求描述 编写一个 Python 程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识点: os 模块综合应用 glob 模块综合应用 利用 g ...

  4. 解压zip_go|用Go写一个zip解压脚本

    用服务器自带的unzip命令解压zip包时,经常遇到编码问题,所以用Go写一个zip解压脚本来处理zip包 代码如下: package mainimport ("archive/zip&qu ...

  5. Java zip解压,并遍历zip中的配置文件 .cfg或.properties

    1.解析cfg或properties配置文件 讲配置文件,读取,并封装成为map类型数据 /*** 解析cfg文件** @param cfgFile* @return*/public static M ...

  6. 解决ubuntu中zip解压的中文乱码问题

    在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码问题. 安装 代码: sudo apt-get install unar 12.04以下或者想编译安装的朋友请参 ...

  7. mysql 5.6.13-winx64_MySQL-5.6.13 zip解压版的安装与配置教程

    本节内容: MySQL-5.6.13解压版(zip版)安装配置教程 一,下载MySQL 5.6.13 MySQL Community Server 5.6.13下载地址: http://dev.mys ...

  8. java zip解压 中文_java解压ZIP 解决中文乱码 (GBK和UTF-8)

    java解压ZIP 解决中文乱码 (GBK和UTF-8) 工具使用 : zip4j GitHub : zip4j 版本 : 2.2.8 Maven : net.lingala.zip4j zip4j ...

  9. php使用ZipArchive扩展实现文件的zip压缩与zip解压

    ZipArchive 是PHP自带的zip扩展类,可以实现对文件或目录实现ZIP文件的压缩和解压,使用前首先要确保PHP ZipArchive扩展已经开启,以下代码亲测可用,但对中文命名的文件不兼容 ...

最新文章

  1. raid5 增加一块硬盘_Raid5热备盘上线同时另一块硬盘离线如何恢复数据
  2. Altium Designer Bottom Solder层的作用
  3. Sqlite数据库中索引的使用、索引的优缺点
  4. 数据产品必知的4层技术知识
  5. NYOJ 37 回文字符串
  6. 使用java修改图片DPI
  7. OpenShift 4 - DevSecOps (2) - 修复 RHACS 发现的安全隐患
  8. Docker系列教程06-实战:修改Nginx首页
  9. Linux开机报write same failed manually zeroing错误
  10. stl list中erase和remove区别
  11. 对于离散行业如何选型MES系统,你知道吗?
  12. 群晖套件 Transmission 汉化
  13. 微分方程matlab绘图,用matlab解微分方程组并作图
  14. 《软件系统架构:使用观点和观点与利益相关者合作》阅读小结——一
  15. pick_types()函数及参数 meg eeg stim eog ecg
  16. Rust: Descending Order
  17. workman安装以及使用
  18. Python之axis函数
  19. 文字保护纱-Material Design
  20. 热部署与定时任务冲突问题解决方案

热门文章

  1. 「菜鸟初探」纯CSS实现二级导航
  2. 自己造个真正意义上的AI纸片人离我们还有多远?
  3. html里div水平居中,html+css div水平居中的几种方法
  4. 理解AXI Quad Serial Peripheral Interface(SPI) IP核
  5. 移动端开发调试工具神器--Weinre使用方法
  6. Linux下4G模块高新兴物联中兴ME3630拨号上网
  7. bluekitchen-stm32f1/csr8311移植笔记(1)-开发环境配置
  8. vue导出table数据为zip压缩文件(学习篇)
  9. php导入excel读取内容
  10. Jmeter安装教程(windows)