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, (^^ゞ