Shikata Ga Nai

Private? There is no such things.

ファイルアップロード脆弱性診断マニュアル(File Upload Vulnerabilities)

Hello there, ('ω')ノ

🎯 1. ファイルアップロードの脆弱性とは?

ファイルアップロードの脆弱性とは、サーバ側でファイルの種類・拡張子・サイズ・保存先などの検証が不十分な場合に、 攻撃者が悪意あるファイル(例:Webシェル、スクリプト)をアップロードして実行・情報漏洩・乗っ取りを引き起こせる問題です。


💥 起こり得る影響

タイプ 影響内容
✅ 任意コード実行 .php, .jsp, .asp などを実行
🕵️‍♂️ 情報漏洩 .htaccess, .env, 設定ファイルを上書き
🔄 他ユーザへの攻撃 .html, .svg, .js による XSS 発動
🗂️ 任意ディレクトリ配置 パストラバーサルと組み合わせた保存先指定
🚫 拡張子バイパス 検査をすり抜けてスクリプトをアップロード

🧭 2. チェックすべきアップロード機能例

ページ・機能 アップロード目的 想定される不正利用
👤 プロフィール画像変更 .jpg, .png .phpファイルを画像に偽装
📄 書類提出フォーム .pdf, .docx .html, .js でXSS誘発
📤 ユーザファイル保存 任意形式 .zip, .php, .exeなど
🎨 画像加工・変換機能 .png.webp ファイル名が変化する処理に注意
📚 マルチファイルアップロード 複数ファイル一括登録 1つだけ悪意あるファイルを紛れ込ませる

🛠️ 3. 診断方法(手順)

  1. 対象機能に正規ファイルをアップロードして挙動確認(ファイル名・保存先)
  2. 許可されていない拡張子のファイルを試す(例:.php, .html, .js
  3. 拡張子を偽装(例:image.php.jpg, shell.php%00.jpg
  4. ファイル内容の中身だけ変更.jpg拡張子で中身はPHPコード)
  5. アップロード完了後、ファイルのパスに直接アクセスして実行されるか確認

🧪 4. 代表的なペイロード・テストファイル例

PHP Webシェル例(中身)

<?php echo shell_exec($_GET['cmd']); ?>

アップロードファイル名例

タイプ ファイル名
拡張子偽装 test.php.jpg, shell.jpg.php
NULLバイト攻撃 shell.php%00.jpg ※古い環境でのみ有効
MIMEタイプ偽装 Content-Type: image/jpeg.phpを送信

🧾 5. サンプル診断例

✅ 正常:

  • .jpg以外のファイルは拒否される
  • ファイルにアクセスしても実行されない(ただのダウンロード)

❌ 脆弱:

  • .php.jpg がアップロードできる
  • アップロード先URLにアクセスするとPHPが実行される
  https://example.com/uploads/shell.php?cmd=whoami

⚠️ 6. よくあるバイパス手法

手法 説明
拡張子2重化 image.php.jpg, image.jpg.php
大文字拡張子 image.PHP, image.PhP
Content-Type偽装 フロントで画像として認識されるよう送信
MIMEと拡張子不一致 ファイル名は.jpg、中身はPHP
ディレクトリトラバーサル ../../shell.php で保存先を指定(要穴)

🔐 7. 防止策・チェックポイント

対策 内容
拡張子のサーバサイド検証 信頼せず必ずバリデーションする
MIMEタイプ検査 クライアントではなくサーバで行う
実行不可ディレクトリに保存 /uploads/.htaccessで実行拒否など
拡張子強制書き換え .jpgなどに置き換える
中身の検査(Magic number) ファイル形式のシグネチャを確認する

🧰 8. 補助ツール

  • Burp Suite:拡張子・Content-Typeの改変送信に最適
  • curl
  curl -F "file=@shell.php" https://example.com/upload
  • exiftool / file:ファイルの中身の形式チェック
  • OWASP Upload Scanner:自動アップロード脆弱性診断

🔑 見つけやすいヒント・兆候

  • ファイル名に php, exe, html が通る
  • アップロード後に /uploads/filename.xxx などのアクセスURLが明示される
  • サムネイル生成などの中間処理がスキップできる

Best regards, (^^ゞ