攻撃者が画像ファイルを悪用しようとする Remote File Inclusion を防御するには、通常、neverinclude
を使用して画像ファイルをPHPコード。
ただし、場合によっては、イメージinclude
sを回避できないこともあります(理由は何でも構いません)。
そのような場合、私は通常、アップロードプロセスのどこかで画像を取得し、それらを別の画像形式(不可逆圧縮と組み合わせることもある)に変換して、元の画像に含まれている可能性のある悪意のあるコードを破棄できるようにします。
これは機能しますが、私はそれに十分に満足していません。主に追加のサーバー負荷が原因で、このような処理が発生し、場合によっては発生する可能性のある画質の低下の可能性があります。
その上でよりスマートな方法またはベストプラクティスはありますか?
[〜#〜]編集[〜#〜]
明確にするために、私は攻撃者がPHPコードを画像ファイルに挿入して、画像のアップロード後にサーバー側で挿入されたコードを実行するようにするという状況について話しています。たとえば、ユーザーがアップロードできるようにするフォーラムパーソナライズ用のアバター(小さな画像ファイル)。
Gd関数を使用して変換することは問題を解決する良い方法ですが、気づいたようにオーバーヘッドが追加されます。また、なぜincludeを使用するのですか?
通常の軽減策はすべて実行したと思います。
あなたが試すかもしれない他のこと
あなたのPHPコードはデータファイルを評価するべきではありません。画像ファイルの内容を出力するかもしれませんが、画像ファイルのinclude()
ingはコードの異常な使用です。私は強くPHPコードを使用して画像を提供していると仮定します。PHPは"<? ?>"
タグの間にないものを評価しないため、これはほとんどの場合に機能します。それは明らかに間違ったアプローチです。
readfile()
関数を探している可能性があります。
それ以外に、外部入力を受け取るincludeステートメントを記述しないでください。
include()
を使用してを含め、評価/実行するシナリオを考えるのに苦労します別のPHPファイルの一部としての画像ファイルは有効なシナリオですが、いつこれが必要ですか?
シナリオについて詳しく説明していただけますか?
ファイルをinclude()
する必要がある場合は、評価されます。また、多くの画像形式ではコメントを追加できるため、ファイルには有効なPHPコマンドを含めることができます。したがって、防御策は、画像のコンテンツ/データをコピーして新しいファイルに保存するか、コメントを取り除くことです。
不可逆圧縮は過剰である可能性が高いです(ただし、有効であると同時に挿入されるオペコードを含む画像を偽造することは可能であるべきですPHP同時に有効であると同時に、画像;それが無損失の画像コピーをそのまま存続させるかどうか私は知りません)。
PHP画像を提供するときにWebサーバーによって実行されるコードを含むアップロードされた画像について話している場合、防御ははるかに簡単です:
.png
- filesが必要な場合は、それらの名前を.png.php
に変更し、URL書き換えを使用してクライアントの.php
を非表示にします側。Suhosin Hardened-PHP モジュールは、リモートファイルインクルード(RFI)/ローカルファイルインクルード(LFI)攻撃に対する保護を備えています。 PHPの open_basedir 構成を使用して、LFI攻撃を防止できます。 PHPを読み取り専用のディレクトリから含めるように強制します。RFIはallow_url_include=Off
を設定することで完全に防ぐことができます。これは現在数年間デフォルトとなっています。
構成を強化することは、多層防御のアプローチとして優れています。ただし、ソフトウェアのテストや既知の脆弱性へのパッチの代わりにはなりません。 w3afプロジェクトはオープンソースであり、LFI/RFIの脆弱性をテストするために使用できます。 Sitewatch は、Webアプリケーションが安全であることを確認するために使用するものです。