web-dev-qa-db-ja.com

ファイル名が渡されない場合、ファイルアップロード機能は脆弱になる可能性がありますか?

グーグルから、ファイルアップロードの脆弱性の多くは、ファイル名に何かを挿入することに依存し、サーバーに保存されている画像にも依存します。画像のコンテンツの投稿リクエスト(file-contents: ‰PNG...... via post request)を行うだけで安全です。 )次に<img src="data:image/png;base64,.....> ?のようにブラウザに表示します

1
Annie

間違いなく!

ファイルのアップロードは非常にトリッキーになる可能性があり、うまくいかないことがたくさんあります。 (少なくとも)2つの追加の手順を実行する必要があります。

1.ファイルが実際にPNGであることを確認します

PNGのみが必要な場合は、ファイルが実際にPNGであることを確認する必要があります。明確にするために、ここでは拡張子を確認しても意味がありません。実際のファイルの内容を確認する必要があります。これを行わない場合は、さまざまなレベルの重大度のいくつかの潜在的な攻撃にさらされます。

  1. 攻撃者はJSファイルをアップロードできます。これは、CSPまたはその他の制限を回避することにより、マルチステップ攻撃の一部として役立ちます。
  2. 攻撃者は独自のHTMLファイル/画像/ Webサイト全体をWebサイトでホストし、フィッシングやその他の攻撃をはるかに簡単にする可能性があります。
  3. サーバーの設定によっては、攻撃者がスクリプトをアップロードしてサーバーにスクリプトを実行させ、システムを危険にさらす可能性があります。

2.サーバーがファイルを実行できないことを確認します

ファイルが有効なPNGであることを確認しても、攻撃者がファイルのアップロードを使用してスクリプトをアップロードおよび実行するのを阻止するには十分ではない場合があります。特に、ほとんどの画像形式では、ヘッダー内のコメントとメタデータを使用できます。これらのコメントに実際のコードを挿入することは可能であり、許容的に構成されたサーバーの場合、攻撃者はサーバーをだまして実行する可能性があります。 ほとんどデフォルトの構成を備えた最新のサーバーはこのような攻撃の影響を受けませんが、このような攻撃は可能であり、確実に発生しています。

ボーナス:他の場所でホストする

上記の攻撃を軽減する最も簡単な方法は、アップロードしたファイルを別の場所でホストすることです。最近のほとんどのクラウドプロバイダーには、このための完全なユースケースであるバケットがあります( [〜#〜] aws [〜#〜][〜#〜] gcp [〜#〜]Azure )ですが、静的ファイルのみを提供する別のドメインの別のサーバーでいつでも自分で管理できます。アップロードされたファイルを別のドメインでホストすることで、CSPバイパスのリスクをスキップし、ファイルをコードとして扱うことができないサーバーでホストすることで、RCEのベクターの欠落を心配する必要がなくなります。要するに、アップロードされたファイルをすぐに別のシステムに転送することで、安全のためにそれらをサンドボックスに入れます。

1
Conor Mancone