web-dev-qa-db-ja.com

画像リモートファイルインクルージョンと対比する方法(例: .gifファイルを使用したRFI(Apache / PHP)?

攻撃者が画像ファイルを悪用しようとする Remote File Inclusion を防御するには、通常、neverincludeを使用して画像ファイルをPHPコード。

ただし、場合によっては、イメージincludesを回避できないこともあります(理由は何でも構いません)。

そのような場合、私は通常、アップロードプロセスのどこかで画像を取得し、それらを別の画像形式(不可逆圧縮と組み合わせることもある)に変換して、元の画像に含まれている可能性のある悪意のあるコードを破棄できるようにします。

これは機能しますが、私はそれに十分に満足していません。主に追加のサーバー負荷が原因で、このような処理が発生し、場合によっては発生する可能性のある画質の低下の可能性があります。

その上でよりスマートな方法またはベストプラクティスはありますか?

[〜#〜]編集[〜#〜]

明確にするために、私は攻撃者がPHPコードを画像ファイルに挿入して、画像のアップロード後にサーバー側で挿入されたコードを実行するようにするという状況について話しています。たとえば、ユーザーがアップロードできるようにするフォーラムパーソナライズ用のアバター(小さな画像ファイル)。

7
Jürgen Thelen

Gd関数を使用して変換することは問題を解決する良い方法ですが、気づいたようにオーバーヘッドが追加されます。また、なぜincludeを使用するのですか?

通常の軽減策はすべて実行したと思います。

  • 特定の拡張子のみを許可し、それらに対してチェックする
  • ランダムなファイル名を使用する
  • getimagesize()を使用します
  • コンテンツタイプを確認する

あなたが試すかもしれない他のこと

  • 画像アップロードディレクトリのphpファイルの実行を無効にする
  • 別のドメインを使用して画像をアップロードするか、ウェブルートの外部に保存します
5
john

あなたのPHPコードはデータファイルを評価するべきではありません。画像ファイルの内容を出力するかもしれませんが、画像ファイルのinclude() ingはコードの異常な使用です。私は強くPHPコードを使用して画像を提供していると仮定します。PHPは"<? ?>"タグの間にないものを評価しないため、これはほとんどの場合に機能します。それは明らかに間違ったアプローチです。

readfile() 関数を探している可能性があります。

それ以外に、外部入力を受け取るincludeステートメントを記述しないでください。

7
Jeff Ferland

include() を使用してを含め、評価/実行するシナリオを考えるのに苦労します別のPHPファイルの一部としての画像ファイルは有効なシナリオですが、いつこれが必要ですか?
シナリオについて詳しく説明していただけますか?

ファイルをinclude()する必要がある場合は、評価されます。また、多くの画像形式ではコメントを追加できるため、ファイルには有効なPHPコマンドを含めることができます。したがって、防御策は、画像のコンテンツ/データをコピーして新しいファイルに保存するか、コメントを取り除くことです。

不可逆圧縮は過剰である可能性が高いです(ただし、有効であると同時に挿入されるオペコードを含む画像を偽造することは可能であるべきですPHP同時に有効であると同時に、画像;それが無損失の画像コピーをそのまま存続させるかどうか私は知りません)。


PHP画像を提供するときにWebサーバーによって実行されるコードを含むアップロードされた画像について話している場合、防御ははるかに簡単です:

  • .php以外のファイル拡張子をPHPとして解釈しないでください。
    動的なPHP作成された.png- filesが必要な場合は、それらの名前を.png.phpに変更し、URL書き換えを使用してクライアントの.phpを非表示にします側。
  • アップロードされた画像(またはそのためのファイル)を、PHPで無視されるように構成されたディレクトリに移動します。
  • アップロードしたファイルを元の名前で保存しないでください。
3
Jacco

Suhosin Hardened-PHP モジュールは、リモートファイルインクルード(RFI)/ローカルファイルインクルード(LFI)攻撃に対する保護を備えています。 PHPの open_basedir 構成を使用して、LFI攻撃を防止できます。 PHPを読み取り専用のディレクトリから含めるように強制します。RFIはallow_url_include=Offを設定することで完全に防ぐことができます。これは現在数年間デフォルトとなっています。

構成を強化することは、多層防御のアプローチとして優れています。ただし、ソフトウェアのテストや既知の脆弱性へのパッチの代わりにはなりません。 w3afプロジェクトはオープンソースであり、LFI/RFIの脆弱性をテストするために使用できます。 Sitewatch は、Webアプリケーションが安全であることを確認するために使用するものです。

2
rook
  1. PHP、JSP、JSPX、ASP、またはASPXを使用しない
  2. ファイルのアップロード、特に画像を許可しない
  3. ファイル処理関数またはクラスを使用しない
0
atdre