Shikata Ga Nai

Private? There is no such things.

ファイルタイプ検証の欠陥(続編):multipart/form-dataのリクエスト構造を理解する

Hello there, ('ω')ノ

✅ multipart/form-dataとは?

フォームで複数の種類のデータ(ファイル・テキストなど)を一緒に送信するための仕組みです。 ファイルアップロードフォームでは必ずこの形式が使われます。


🎯 multipart/form-dataリクエストの例

以下は実際のファイルアップロード + テキストデータ送信の例です。

POST /images HTTP/1.1
Host: normal-website.com
Content-Length: 12345
Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456

-----------------------------012345678901234567890123456
Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg

[...example.jpgのバイナリデータ...]
-----------------------------012345678901234567890123456
Content-Disposition: form-data; name="description"

This is an interesting description of my image.
-----------------------------012345678901234567890123456
Content-Disposition: form-data; name="username"

wiener
-----------------------------012345678901234567890123456--

📝 各パートの解説

1️⃣ ファイル(imageフィールド)

Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg
  • name="image" → フォームのinput名
  • filename="example.jpg" → アップロードファイル名
  • Content-Type: image/jpeg → ファイルタイプ宣言

この部分に画像ファイルのバイナリデータが含まれます。


2️⃣ テキスト入力(descriptionフィールド)

Content-Disposition: form-data; name="description"

This is an interesting description of my image.
  • 単なる説明文(通常のテキストデータ)

3️⃣ テキスト入力(usernameフィールド)

Content-Disposition: form-data; name="username"

wiener
  • 入力されたユーザー名

🧠 攻撃者が狙うポイント

✅ Content-Disposition

  • 攻撃者は filename="example.jpg.php"filename="shell.pHp" のように ファイル名を細工して検証をバイパスします。

✅ Content-Type

  • 攻撃者はツール(例:Burp Suite)を使い Content-Type: image/jpeg に偽装しながら、 実体は PHPスクリプト を送り込むことができます。

✅ 多くの脆弱サイトはContent-Typeやファイル名だけをチェックし、 実ファイルの内容(マジックバイト)まで確認していないため突破されます。


🎯 まとめ:multipart/form-dataの仕組みと脆弱性

項目 攻撃者の悪用方法
Content-Disposition ファイル名偽装(shell.jpg.phpなど)
Content-Type MIME偽装(image/jpegとして送信)
フォーム構造 複数パートに分かれるため検証が甘くなる

✅ 開発者側の対策

対策 内容
✅ ファイル名の正規化 パス名や拡張子の異常値を除去
✅ マジックバイト確認 実際のファイル内容で判定
✅ 実行不可ディレクトリに保存 スクリプトファイルが実行されない
✅ ファイル名の自動ランダム化 攻撃者のファイル名意図を阻止

🎯 攻撃者視点のまとめ

multipart/form-dataは便利さと柔軟さを持つ反面、 検証の不備を突きやすい構造です。 Burp SuiteやOWASP ZAPなどで簡単に改変できるため、 テスター・攻撃者はここを重点的に狙います。


「multipartは便利だが最大の盲点」 この構造を深く理解することが ファイルアップロード脆弱性の検出・悪用・防御のすべての基礎になります。

Best regards, (^^ゞ