web-dev-qa-db-ja.com

.png拡張子のファイルにコードまたは画像が含まれているかどうかを検出する方法は?

私のWebホストがPOSTファイルのPHPでハッキングされて以来、ここ数日トラブルに見舞われました。私はPHPコードを含む.png拡張子のファイルを扱ってきました。有効な.pngファイルかどうかを確認するために1つずつ編集することもできません。

.pngを持つファイルが本物か偽物かを一括チェックする方法はありますか?

5
fiskolin

私のWebホストがPOSTファイルのPHPでハッキングされて以来、ここ数日トラブルに見舞われました。 PHPコードが含まれる.png拡張子のファイルを扱ってきました。

これが、アップロードスクリプトにエラーチェックを実装する必要がある理由です。そのように、アップロードされたファイルをテストして、データが有効であることを確認し、データが有効でない場合、ファイルを破棄してエラーWebページを表示できます。

有効な.pngファイルかどうかを確認するために1つずつ編集することさえできません。 .pngのファイルが本物か偽物かを一括チェックする方法はありますか?

アップロードされた各ファイルを開くスクリプトを作成し、最初の数バイトをチェックしてファイルが有効であることを確認できますが、上記のようにファイル検証をアップロードスクリプトに追加することにした場合、これは将来の不要な手順です。

また、誰かがコメントで述べたように、スクリプトの実行から少なくともある程度保護するために、アップロードディレクトリを実行ビットが設定されていないディレクトリにします。また、フォルダーを一般の人がアクセスできないようにして、ファイルを検証し、検証したときにのみ一般に受け入れられるようにすることができます。

2
Mike

.pngのファイルが本物か偽物かを一括チェックする方法はありますか?

いいえ、そうでもありません。

回答とコメントで提案されているため:ファイルの最初のXバイトをチェックすることは、PHPコードが含まれているかどうかを判断する適切な方法ではありません(最初のXバイト?)。

さらに、PHPコードはメタデータまたはIDATチャンクで非表示にすることができます。つまり、PHPコードも含まれる完全に有効な画像ファイルを作成できます。

画像にさらに有害なデータが含まれているかどうかを確認する かどうかは非常に困難です。

だからあなたがしたいことは:

  • 拡張機能を確認してください。 pngの場合、実行されません(htaccessファイルのアップロードも許可するか、LFIの脆弱性がある場合を除く)
  • webルートの外部にファイルを保存します(ここでも、LFI経由以外は実行できません)
  • そのディレクトリでの実行を禁止します(再び、LFIを介してバイパスできます)
  • 画像からすべてのメタデータを削除します(メタデータ内のPHPコードを削除します)
  • イメージを別の形式に変換します(IDATチャンクまたは同様の方法でPHPコードを破壊します)
  • @ mani のように、PHPタグを開くためにアップロードされたファイルを検索できます。 <?php<?=、および<script(大文字と小文字を区別しない)を必ず検索する必要があります。さらに、<?(短いタグが許可されている場合)および<%(aspタグが許可されている場合)を検索することもできます。これはPHPコードを処理しますが、他の有害なコンテンツは処理しません。
2
tim

最近では、セキュリティ上の理由からほとんどのホスティングで、短いタグ"<?".を無効にしています

そのため、アップロードされたファイルで"<?php"のgrep/strstrを実行できます。一致するものが見つかった場合は、ファイルを削除します。

私たちはこれを長い間フォローしてきましたが、非常にうまく機能しているようです。

2
Mani