10

exif_imagetypeは、画像ファイルの代わりに php やその他のシェル コードをアップロードすることを避けるための安全な関数であると読みました。最近、いくつかの簡単な方法でこの安全な機能をバイパスできるという別の記事を読みました。したがって、誰かがバイパスする正確な方法を知っている場合は、答えを共有できます.

PHPスクリプトで次のコードを使用したため、これが脆弱かどうかを知り、同じ問題を解決したかった

 if (! exif_imagetype($_FILES['upload']['tmp_name'])) 
   { 
    echo "File is not an image";
   }
4

4 に答える 4

9

exif_imagetype を実行するのは少し複雑です。この関数は、ファイルの先頭にあるマジック ナンバーをチェックするだけなので、さらにチェックが必要です。ソフトウェアについての知識がなければ、判断を下すのは難しいですが、次の例を考えてみてください。

JPEG マジック ナンバー 0xFFD8FFE0 の後に文字列<? passthru($_GET["cmd"]); ?>.

あなたのサーバーにアップロードします。マジックナンバーはバイパスしexif_imagetypeます。ファイルが にアップロードされwww.your-domain.com/uploads/shell.phpます。次に、 に移動しwww.your-domain.com/uploads/shell.php?rm -r *ます。サーバーは開始を検出し、 <?PHP の解釈を開始します。わーい!あなたが Linux Web サーバーで実行していると仮定して、すべてのアップロードを削除しました。

画像のメタデータに悪意のあるスクリプトが含まれている可能性があるため、画像の有効性をさらに詳しくチェックしても役に立ちません。これは、ファイル拡張子のホワイトリストを使用することによってのみ防止されます。

[TL;DR] さらにチェックしないと安全ではありません。適切なファイル名を確保し、ファイル拡張子のホワイトリストを使用し、ファイル サイズを制限し、標準的なセキュリティ対策を実行する必要があります。

于 2016-11-01T19:04:12.453 に答える
-5

セキュリティのために私は使用します

$extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);

if(!in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif')))
{
    echo "File is not an image";
}
于 2014-12-18T11:14:42.400 に答える