何が起きるか

ファイルアップロードの不備は、投稿者が送ったファイルの名前・内容・保存先を信用し、保存後にプログラムとして実行したり、サイトの一部として配信したりする問題です。

サーバー実行の説明用の例では、画像投稿APIがプログラムを画像と誤認してWeb公開領域へ保存します。攻撃者が保存したURLへHTTPリクエストを送り、Webサーバーがその拡張子のファイルをスクリプトとして実行する設定なら、アプリのOSユーザーの権限で攻撃者の処理が動きます。処理が設定ファイルを読み、応答へその内容を返せば、攻撃者は秘密を取得できます。 ここでいうOSユーザーは、Webサーバーから呼ばれた実行プロセスに割り当てられたOSアカウントで、投稿者のサイト内アカウントとは別です。そのOSアカウントへ許可されたファイルだけを読んだり書いたりできます。

アップロード成功だけでコードが実行されるわけではありません。保存先、拡張子の扱い、後から起動・配信する設定まで必要です。ブラウザ向けにHTMLを同じオリジンで配信する不備では、サーバーではなく閲覧者のブラウザでJavaScriptが動くため、実行場所を区別します。 オリジンはURLのスキーム・ホスト・ポートの組です。投稿HTMLのURLがアプリと同じ組なら、そのページ内のJavaScriptは同じオリジンのAPIへ接続します。ブラウザがAPI宛てにログインCookieを付ける構成では、閲覧者向けの応答を読める場合があります。

正常ならどう動くか

サーバーは投稿されたファイルを受け取り、許可する形式・内容・容量を検査し、固定の保管領域へ自分で生成した名前を使って保存します。アップロードのファイル名とContent-Typeは投稿者が変更できる申告値なので、それらだけで画像と判断しません。 アップロード時のContent-Typeは、ファイルと一緒に送るHTTPデータの中で投稿者側が指定する種類です。内容がHTMLでもimage/pngと申告できるため、ファイル内の実データと同じ情報ではありません。配信時のContent-Typeは、逆にサーバーがHTTPレスポンスへ設定し、ブラウザがどう解釈するかに関係します。

保存領域はプログラムの実行対象にせず、配信するときも、投稿されたHTMLなどをサイトの画面として実行させないようにします。添付ダウンロードとして返す場合や、認証Cookieやアプリの権限を共有しない別オリジンで配信する方式が考えられます。画像変換などでファイルを解析する処理も、容量と処理時間を制限します。

不備と攻撃が成立する流れ

サーバー側の実行を示す例です。画像だけを扱うはずの機能が、検査をすり抜けたプログラムをWeb公開領域へ保存してしまいます。後からそのURLへHTTPリクエストが届き、Webサーバーが保存ファイルをスクリプトとして実行する設定なら、画像の表示ではなく攻撃者の処理が動きます。

投稿者が保存先のパスまで指定でき、アプリがそのまま採用すると、アップロードした内容で既存の設定ファイルなどを上書きする場合があります。ファイルの内容が正しい画像かどうかと、書き込み先を制限できているかは別の検査です。

ブラウザ側の例では、投稿されたHTMLやSVGを、サイトと同じオリジンでページとして配信します。閲覧者がそのURLを開き、ファイル内のJavaScriptをブラウザが実行すると、投稿者のコードがサイトの一部として動きます。添付データとして返すだけの場合とは、配信時の解釈が異なります。

起こり得る被害と条件

サーバー実行の例では、動いたコードがアプリの設定ファイルを読み、レスポンスや外部通信で攻撃者へ内容を渡します。攻撃者は接続パスワードなどを入手するおそれがあります。実行ユーザーがそのファイルを読めることと、情報を返せる経路が条件です。

上書きの例では、アプリが次に読み込む設定の接続先が攻撃者のサーバーへ変わると、その後のデータ送信先を変えられるおそれがあります。書き込み権限と、変更したファイルが実際に採用されることが必要です。

ブラウザ実行の例では、コードが同一オリジンのAPIへHTTPリクエストを送ります。ブラウザが送信条件に合う被害者のログイン用Cookieを付け、APIが許可すれば、非公開メッセージの取得や登録メールアドレスの変更を行えます。APIがメッセージ本文を返し、コードが本文を攻撃者のサーバーへ送信できれば、攻撃者が他人の会話内容を入手します。変更にはAPIの認可・再認証などの条件も関係します。

防ぎ方と、防げる理由

許可する形式を限定し、ファイルの内容も検査します。固定の保管領域と生成した保存名を使い、その領域をプログラムの実行対象から外します。配信時は用途に応じて別オリジンや添付ダウンロードを使い、投稿したHTMLがサイトの権限で動く経路を減らします。変換処理には容量と時間の制限を設け、一つの大きなファイルで処理を占有される範囲を抑えます。解析ライブラリに別のコード実行の欠陥がある場合も、実行プロセスへ秘密ファイルを共有せず低権限にしておけば、そこで動いた処理が読める秘密を減らせます。これは保存したスクリプトをWebサーバーが起動する経路とは別の防御です。

よくある誤解

ウイルス検査は、保存先を脱出するパスや、ブラウザでのHTML解釈まで保証しません。「画像」という拡張子でも、実際の内容と変換ライブラリ、配信時の扱いを確認する必要があります。

実装の確認点

保存名・フォルダ・上書きの指定元を調べ、実際の保存場所と実行権限を確認します。配信時のContent-Type、ダウンロード指定、別オリジン化、変換ツールの版と資源制限も合わせて追います。

出典・確認範囲

  1. [1] Web Security Academy: ファイルアップロードの不備PortSwigger / 確認日 2026-10-29