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. 診断方法(手順)
- 対象機能に正規ファイルをアップロードして挙動確認(ファイル名・保存先)
- 許可されていない拡張子のファイルを試す(例:
.php, .html, .js)
- 拡張子を偽装(例:
image.php.jpg, shell.php%00.jpg)
- ファイル内容の中身だけ変更(
.jpg拡張子で中身はPHPコード)
- アップロード完了後、ファイルのパスに直接アクセスして実行されるか確認
🧪 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, (^^ゞ