web-dev-qa-db-ja.com

PHP $ _FILES配列を使用したディレクトリの横断?

私はファイルのアップロードを処理しているphpアプリケーションに取り組んでいます。 /../../../../etc/などのファイル名にパストランスバーサルペイロードを挿入しようとしています。

問題は、脆弱なコード行が$_FILES["name"]配列を通じてファイル名を使用していることです。この組み込みのphp配列は、すべての脆弱な特殊文字に対して自動サニタイズを行っています。

それで十分な保護なのか、それとも他のサニタイズを追加する必要があるのか​​と思っていました。 PHPのサニタイズをバイパスする方法はありますか?

5
KB303

...脆弱なコード行...

どのように脆弱ですか?

  • エンドユーザーが/ etc内のファイルを上書きできる場合、深刻な権限の問題があります

  • ユーザーが(たとえば)/ etc/shadowをアップロードしたことをアプリケーションに納得させることができるが、アクセス許可の問題が原因で書き込みが失敗し、/ etc/shadowを取得できる場合、アクセス許可の問題に加えてアプリケーションコードでのトランザクション管理/エラー処理に関する大きな問題

短いバージョンでは、$ _ FILES [] ["name"]パラメータがユーザーによって提供/制御されます。ディレクトリトラバーサルは、データを使用してサーバー上のコンテンツのファイル名/場所を特定する場合に発生する問題の1つにすぎません。 より多くのサプライズが用意されています があります。

インデックス作成のために$ _FILES [] ["name"]データを保持する必要がある場合がありますが、サーバー上の新しい名前/場所を選択します。できれば、アップロードされたコンテンツとして明示的に識別するMIMEタイプに関連付けます。

このアドバイスに従い、名前データを保持する必要がある場合は、ユーザーが指定した名前と選択した名前の間のマッピングを保存する方法によっては、攻撃対象が増える可能性があることに注意してください(たとえば、データがSQLインジェクションのベクトル)。

0
symcbean

私の経験によれば、_$_FILES["uerrfile"]["name"]_は、ファイル名の部分のみで構成されており、パスは省略されています。

ただし、PHPマニュアル とにかくbasename()関数を使用することをお勧めします なので、他の方法で説明することはできません。

余談ですが、元のファイル名は、複製したり、特殊文字を含めたり、長すぎて切り捨てられたりする可能性があるため、扱いが非常に不便であるため、使用しないことをお勧めします。

したがって、システムによって割り当てられた新しい名前はより使いやすくなります。個人的には、ファイルの内容からmd5()の後にファイルに名前を付ける習慣を身につけました。または、uniqid()などの他の方法を使用することもできます。

0