web-dev-qa-db-ja.com

PHPによって処理され、Webサーバーのサイト構成ファイルによってブロックされている場合、Webサーバーのルートの下にファイルを保存することは安全ではありませんか?

特定のタイプのファイルのアップロードを取得し、それらをWebルートのサブディレクトリ(「ビデオ」と呼ぶ)に配置するWebサイトがあるとします。

アップロードされたファイルを信頼することは決して安全ではないというさまざまな情報源から聞いたことがあります。それは、ペイロードをアップロードして実行できるためです。ファイル拡張子を確認しても理想的には、ファイル全体をチェックする必要があります(アップロードされたファイルが巨大なビデオファイルである場合、システムの速度が低下する可能性があります)。

だから私の質問は-次の設定ではまだ安全ですか?
POST PHPスクリプトへのリクエストでファイルの拡張子を確認し、ファイルの名前を変更して、ファイルをsubdir "videos"。サブディレクトリ "videos"が次のように保護されているとしましょう(nginx):

 location ~ /(videos/|admin-stuff|etc) { deny all; }

ファイルがディレクトリに配置されると、それらには-rw-r--r--権限。正しく理解できていれば、どうしてもファイルにアクセス/実行できません。
それはまだ脆弱性ですか?

ありがとう。

3

POST PHPスクリプトへのリクエストでファイルの拡張子をチェックし、ファイルの名前を変更する

MIMEタイプを確認してください。 PHP have mime_content_typefunction for that。mimeヘッダーをだましてファイルのメタデータにコードを含めることが可能であっても、これによりシステムを悪用するためのバー。

正しく理解できていれば、どうしてもファイルにアクセス/実行できません。

あんまり。シェルから直接実行することはできません。攻撃者がscript.mp4という名前のスクリプトをアップロードし、何らかの理由でbash the-new-name.mp4を後で実行することを阻止するものはありません。

または、ローカルファイルインクルード(LFI)の脆弱性を使用し、include videos/the-new-name.mp4を使用して、ID3の説明フィールドでコードを実行します。ファイルからメタデータを削除する可能性があるため、攻撃者がメタデータに埋め込まれたシェルを使用してビデオを送信し、LFIを利用するビデオを含めたとしても、実行することはできません。

Nginxの設定は良好です。

1
ThoriumBR

ファイルシステム階層内の場所については、/videos/var/www/html/site/videosなどの違いはありません。問題は、実行権限ビット、ディレクトリとファイルに付与されているアクセス許可(前述)、およびそれらが割り当てられているユーザー(www-adminnginxなど)です。

また、ファイルのアップロードは特定のファイル拡張子に制限する必要がありますが、 mime-type を確認して、単にファイルの名前を変更していないことを確認する必要があります。また、ファイルは ClamAV などのウイルス対策ソフトウェアでスキャンする必要があります。

0
rage