web-dev-qa-db-ja.com

すべてのサブディレクトリでシェルの実行を拒否するにはどうすればよいですか?

/ webroot/uploads内にフォルダーを持つユーザーをnginxで拒否したい

例えば.

/webroot/uploads/user1
/webroot/uploads/user2
/webroot/uploads/user999

任意のシェル(php、pl、py、binary)を実行します。

シェルは多くの場合、jpgまたはgifファイルに隠されています。 badfile.php.jpgのように

また、悪意のあるバイナリファイルがフォルダにアップロードされているのもわかります。

ここに私の予備的なルールがあります:

location ~ /webroot/uploads/(.+)\.php$ {
 deny all;
}

location ~ /webroot/uploads/(.+)\.pl$ {
 deny all;
}

しかし、それが十分に堅牢かどうかはわかりません。だから私はあなたの助けに感謝します。

1
hnn

まず、設定ファイル( http://wiki.nginx.org/FullExample#mime_types )でmime.typesが適切に設定されていることを確認します。これにより、foo.php.jpgは引き続き使用されます。画像として扱われます。

また、チルダ(〜)だけでなくチルダアスタリスク(〜*)を使用すると、正規表現の大文字と小文字が区別されなくなります(したがって、blah.pHPやevil.PHpなどのファイルが防止されます)。

location ~* /webroot/uploads/(.+)\.php$ {
  deny all;
}

採用できるアプローチの1つは、許可されている拡張機能をホワイトリストに登録し、他の拡張機能を処理することです。 Nginx 構文がありません 式に一致しないため、一致が見つかったときに「何もしない」ことができ、残りを拒否/リダイレクトできます

location ~* /webroot/uploads/(.+)\.(jpg|gif|png|mp3)$ {
  # empty block
}

# all other requests come here
location / {
  # redirect, deny, ...
}
1
ndrix