特定のタイプのファイルのアップロードを取得し、それらをWebルートのサブディレクトリ(「ビデオ」と呼ぶ)に配置するWebサイトがあるとします。
アップロードされたファイルを信頼することは決して安全ではないというさまざまな情報源から聞いたことがあります。それは、ペイロードをアップロードして実行できるためです。ファイル拡張子を確認しても理想的には、ファイル全体をチェックする必要があります(アップロードされたファイルが巨大なビデオファイルである場合、システムの速度が低下する可能性があります)。
だから私の質問は-次の設定ではまだ安全ですか?
POST PHPスクリプトへのリクエストでファイルの拡張子を確認し、ファイルの名前を変更して、ファイルをsubdir "videos"。サブディレクトリ "videos"が次のように保護されているとしましょう(nginx):
location ~ /(videos/|admin-stuff|etc) { deny all; }
ファイルがディレクトリに配置されると、それらには-rw-r--r--
権限。正しく理解できていれば、どうしてもファイルにアクセス/実行できません。
それはまだ脆弱性ですか?
ありがとう。
POST PHPスクリプトへのリクエストでファイルの拡張子をチェックし、ファイルの名前を変更する
MIMEタイプを確認してください。 PHP have mime_content_type
function for that。mimeヘッダーをだましてファイルのメタデータにコードを含めることが可能であっても、これによりシステムを悪用するためのバー。
正しく理解できていれば、どうしてもファイルにアクセス/実行できません。
あんまり。シェルから直接実行することはできません。攻撃者がscript.mp4
という名前のスクリプトをアップロードし、何らかの理由でbash the-new-name.mp4
を後で実行することを阻止するものはありません。
または、ローカルファイルインクルード(LFI)の脆弱性を使用し、include videos/the-new-name.mp4
を使用して、ID3の説明フィールドでコードを実行します。ファイルからメタデータを削除する可能性があるため、攻撃者がメタデータに埋め込まれたシェルを使用してビデオを送信し、LFIを利用するビデオを含めたとしても、実行することはできません。
Nginxの設定は良好です。