web-dev-qa-db-ja.com

ハッカーがphpファイルのアップロードをバイパスすることは可能ですか?

スクリプトでフィルタリングシステムを指定します。ここにあります :

<?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でファイルをアップロードするための拡張子をチェックすることを意味します。では、ハッカーがこのシステムをバイパスすることは可能でしょうか?悪意のあるコードスクリプトをアップロードしますか?

5

この小さなコードの断片が含まれているアプリケーションを考えると、多くのことがうまくいかない可能性があります。

  1. 攻撃者は、 ローカルファイルに脆弱性を含む脆弱性を使用して、アップロードされた画像のメタデータ内にPHPコードを置くことにより、リモートコード実行 を取得する可能性があります。
  2. 攻撃者は有効なファイルで画像を書き込む可能性があります
    directory traversal を使用した任意のディレクトリの拡張子。
  3. 古いバージョンのPHPでは、攻撃者はnullバイトを使用してファイル名を切り捨てることにより拡張機能を制御できましたが、 FILE関数はPHP以降、nullバイトをエスケープします5.3.4。
10
rook

はい。

使用しているような単純なチェックをバイパスする一般的な方法は、実際の画像ファイル(JPEGなど)を使用して、画像のコメント内にリモートシェルを追加することです。

実装に脆弱性があるかどうかを確認するには、有効な写真を撮り、選択したエディター(Photoshop、GIMPなど)で次の基本的なシェルをコメントとして追加します。

<?php echo "<pre>"; system($_GET['cmd']); ?>

画像が正常にアップロードされたら、cmdパラメータを単純なコマンドに設定して呼び出します(例/ upload/Shell.jpg?cmd = ls)。アップロード先のフォルダーが任意の種類のファイルを実行する場合、シェルがアクティブである必要があります。

注:一部のPHP関数、ここで使用されているsystemなどの関数は無効にできます。この場合、順番に試行できるいくつかの関数または異なる関数があります。コマンドを実行します。

0
Gurzo

それ自体は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も必要ありません。

0
Mike Mackintosh