21

ユーザーが自分のサーバーにファイルをアップロードできるようにしています。どのようなセキュリティ上の脅威に直面する可能性があり、どのようにそれらを排除できますか?

ユーザーがシステムまたはネットからサーバーに画像をアップロードできるようにしているとしましょう。これらの画像のサイズも確認するには、/tmpフォルダに保存する必要があります。危険ではないですか?どうすればリスクを最小限に抑えることができますか?

wgetまた、ユーザーが私のフォームにアップロードしたリンクから画像をダウンロードするために使用しているとしましょう。まず、これらのファイルをサーバーに保存して、実際に画像であるかどうかを確認する必要があります。また、いたずら者がURLを教えてくれて、マルウェアでいっぱいのWebサイト全体をダウンロードしてしまうとどうなりますか?

4

4 に答える 4

34

まず、ファイルをアップロードするということは、ユーザーがさまざまな形式で大量のデータを提供していること、およびユーザーがそのデータを完全に制御できることを意味します。これは、通常の形式のテキスト フィールドの場合でも問題です。ファイルのアップロードは同じですが、それ以上です。最初のルールは次のとおりです。それを信用しないでください。

ファイルのアップロードでユーザーから得られるもの:

  • ファイルデータ
  • ファイル名
  • MIME タイプ

これらはファイル アップロードの 3 つの主要なコンポーネントであり、どれも信頼できません。

  1. の MIME タイプを信頼しないでください$_FILES['file']['type']。これは完全に任意のユーザー提供の値です。

  2. 重要なことにはファイル名を使用しないでください。これは完全に任意のユーザー提供の値です。一般に、ファイル拡張子や名前を信頼することはできません。などを使用してファイルをサーバーのハードディスクに保存しないでください'dir/' . $_FILES['file']['name']。名前が の場合、'../../../passwd'他のディレクトリのファイルを上書きしています。ファイルを保存するには、常にランダムな名前を自分で生成してください。必要に応じて、元のファイル名をメタデータとしてデータベースに保存できます。

  3. 誰にも、何かに勝手にファイルにアクセスさせてはいけません。たとえば、攻撃者がmalicious.phpファイルをサーバーにアップロードし、それをサイトの webroot ディレクトリに保存している場合、ユーザーは単にアクセスしexample.com/uploads/malicious.phpてそのファイルを実行し、サーバー上で任意の PHP コードを実行できます。

    • 任意のアップロードされたファイルを公の場所に保存しないでください。常に、アプリケーションだけがアクセスできる場所に保存してください。

    • 特定のプロセスにのみファイルへのアクセスを許可します。画像ファイルであることが想定されている場合は、画像を読み取ってサイズを変更するスクリプトのみがファイルに直接アクセスできるようにします。このスクリプトでファイルの読み取りに問題がある場合は、おそらく画像ファイルではないため、フラグを立てるか破棄してください。他のファイルの種類についても同様です。ファイルを他のユーザーがダウンロードできるようにする場合は、ダウンロード用にファイルを提供し、それ以外には何もしないスクリプトを作成します。

    • 扱っているファイルの種類がわからない場合は、ファイルの MIME タイプを自分で検出するか、特定のプロセスでファイルを開くようにしてください (たとえば、画像のサイズ変更プロセスで想定される画像のサイズを変更しようとします)。ここでも注意してください。そのプロセスに脆弱性がある場合、悪意を持って作成されたファイルがそれを悪用し、セキュリティ侵害につながる可能性があります (このような攻撃の最も一般的な例は、Adobe の PDF リーダーです)。


特定の質問に対処するには:

[T]これらの画像のサイズもチェックするには、/tmp フォルダーに保存する必要があります。危険じゃないですか?

いいえ。一時フォルダー内のファイルにデータを保存するだけでは、そのデータで何もしていない場合は危険ではありません。データは、その内容に関係なく、単なるデータです。データを実行しようとしている場合、またはプログラムがデータを解析している場合にのみ危険です。プログラムに解析の欠陥が含まれていると、悪意のあるデータによってだまされて予期しないことを実行する可能性があります。

もちろん、何らかの悪意のあるデータがディスク上に存在することは、悪意のあるデータがどこにも存在しない場合よりもリスクが高くなります。誰がやって来て何かをするかは決してわかりません。そのため、アップロードされたデータを検証し、検証に合格しない場合はできるだけ早く破棄する必要があります。

いたずら者が URL を教えてくれて、マルウェアだらけの Web サイト全体をダウンロードしてしまったらどうしますか?

何をダウンロードするかはあなた次第です。1 つの URL から得られるデータのブロブは最大でも 1 つです。そのデータを解析していて、最初の blob に基づいてさらに多くの URL のコンテンツをダウンロードしている場合、それが問題です。やらないでください。しかし、仮にそうしたとしても、一時ディレクトリがいっぱいになってしまいます。繰り返しますが、そのようなもので危険なことをしていなければ、これは危険ではありません。

于 2012-06-16T07:16:49.000 に答える
5

1 つの単純なシナリオは次のとおりです。アップロードが許可されているファイルの種類に関する制限がないアップロード インターフェイスを使用する場合、攻撃者は、サーバーの侵害につながる可能性のある悪意のあるコードを含む PHP または .NET ファイルをアップロードできます。

参照: http://www.acunetix.com/websitesecurity/upload-forms-threat.htm 上記のリンクでは、一般的な問題について説明しています

参照: http://php.net/manual/en/features.file-upload.php

于 2012-06-16T06:31:08.577 に答える
3

それらのいくつかを次に示します。

  • ファイルがサーバーにアップロードされると、PHP は変数 $_FILES['uploadedfile']['type'] を、クライアントが使用している Web ブラウザーによって提供される MIME タイプに設定します。ただし、ファイル アップロード フォームの検証は、この値だけに依存することはできません。悪意のあるユーザーは、HTTP POST 要求の送信を許可するスクリプトまたはその他の自動化されたアプリケーションを使用して、ファイルを簡単にアップロードできます。これにより、偽の MIME タイプを送信できます。

  • 攻撃者が使用できる可能性のあるすべての拡張機能を含むリストを作成することは、ほとんど不可能です。たとえば、コードがホストされた環境で実行されている場合、通常、そのような環境では、Perl、Python、Ruby などの多数のスクリプト言語が許可されており、リストは無限にある可能性があります。

    悪意のあるユーザーは、以下のようなコード行を含む「.htaccess」というファイルをアップロードすることで、このようなチェックを簡単に回避できます。AddType application/x-httpd-php .jpg

于 2012-06-16T06:32:38.553 に答える
3

ファイルのアップロードに関する一般的な問題を回避するための一般的なルールがあります。

  • アップロードされたファイルWeb サイトのルート フォルダー以外に保存します。これにより、ユーザーはアプリケーション ファイルを書き換えたり、アップロードされたファイルに直接アクセスしたりできなくなります (たとえば、アプリが/var/wwwにあるのに/var/uploadsにある場合)。
  • サニタイズされたファイル名をデータベースに保存し、物理ファイルに名前のファイル ハッシュ値を指定します (これにより、ファイルの重複を保存する問題も解決されます - それらは等しいハッシュを持つことになります)。
  • /var/uploads フォルダーにファイルが多すぎる場合にファイルシステムの問題を回避するには、次のようにフォルダー ツリーにファイルを保存することを検討してください。

    file hash = 234wffqwdedqwdcs-> 保管してください/var/uploads/23/234wffqwdedqwdcs

    共通ルール: /var/uploads/<first 2 hash letters>/<hash>

  • まだ行っていない場合は、nginxをインストールします。魔法のように静的に機能し、その'X-Accel-Redirect'ヘッダーにより、カスタム スクリプトによって最初にアクセス許可がチェックされるファイルを提供できます。

于 2012-06-16T08:00:38.507 に答える