スクリプトでフィルタリングシステムを指定します。ここにあります :
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png","bmp");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (in_array($extension, $allowedExts)){
//here is rst of codes
?>
私のスクリプトがexplode
でファイルをアップロードするための拡張子をチェックすることを意味します。では、ハッカーがこのシステムをバイパスすることは可能でしょうか?悪意のあるコードスクリプトをアップロードしますか?
この小さなコードの断片が含まれているアプリケーションを考えると、多くのことがうまくいかない可能性があります。
はい。
使用しているような単純なチェックをバイパスする一般的な方法は、実際の画像ファイル(JPEGなど)を使用して、画像のコメント内にリモートシェルを追加することです。
実装に脆弱性があるかどうかを確認するには、有効な写真を撮り、選択したエディター(Photoshop、GIMPなど)で次の基本的なシェルをコメントとして追加します。
<?php echo "<pre>"; system($_GET['cmd']); ?>
画像が正常にアップロードされたら、cmdパラメータを単純なコマンドに設定して呼び出します(例/ upload/Shell.jpg?cmd = ls)。アップロード先のフォルダーが任意の種類のファイルを実行する場合、シェルがアクティブである必要があります。
注:一部のPHP関数、ここで使用されているsystemなどの関数は無効にできます。この場合、順番に試行できるいくつかの関数または異なる関数があります。コマンドを実行します。
それ自体は100%安全ではありませんが、拡張子 _exif_imagetype
_ を使用するのではなく、ファイルのMIMEタイプを確認することをお勧めします。これは、画像の検証に役立つ良いステップです。
誰もが悪意のあるPHPコードを.gifファイルに貼り付けることができ、多くのfcgi/fpmとルーティングにより、PHPにアップロードされた場合、 Webに面したディレクトリと攻撃者がこのページを閲覧します。
これを回避するには、ファイルがウェブルートにないことを確認します。何らかのルーティングやURLの書き換えを使用している場合は、_.gif|.jpg|.jpeg
_などのPHP-FPM/mod_phpをオフにします。これにより、長期的にも同様です。どこかにゼロデイが存在しない限り、ファイルのアップロードはそのファイルに対してeval()
を実行しないため、悪意があるためにはファイルに直接アクセスする必要があります。
これに加えて、画像に対してarray getimagesize ( string $filename [, array &$imageinfo ] )
を実行することをお勧めします。 _0
_を返す場合、それは有効なイメージではありません。これが機能するためにGd
も必要ありません。