2017-01-08 18 views
0

PNGを処理するときにPHP ImagickがIDATチャンクを変更することに気付きました。 これはどのように正確に行われますか?変更されないIDATチャンクを作成する可能性はありますか? Imagickの結果を予測することは可能ですか?この質問へPNG IDATチャンクのPHP Imagickの再解釈

背景情報: 私は、次のコード(PHPのファイルアップロードの一部)はPNG画像に隠れPHPコード(例えばwebshel​​ls)を防ぐことができるかどうか疑問に思った:

$image = new Imagick('uploaded_file.png'); 
$image->stripImage(); 
$image->writeImage('secure_file.png'); 

コメントが取り除かれこのフィルタをバイパスする唯一の方法は、IDATチャンクにPHPペイロードを隠すことです。 hereで説明したように、理論的には可能ですが、CompressionCompressionQualityをPNGの作成に使用した値に設定しても、Imagickはこのイメージデータを再解釈します。また、ZLIBヘッダーがImagickによって変更されていないPNGを作成することもできましたが、圧縮されていないイメージデータは変更されませんでした。同じ入力と出力を持つ唯一のPNGはImagickを前に通過したものです。私もsource codeの理由を見つけようとしましたが、見つけられませんでした。

アップロードされたファイルが実際にPNGなどであることを確認するために、他のチェックが必要であることを知っています。サーバーが正しく設定されていればPNGのPHPコードは問題ありませんが、この問題で。

答えて

1

IDATチャンクは、変化しても同じ画像を生成できます。残念なことに、PNG仕様では、IDATチャンクに強制的に1つの連続したデータストリームが形成されます。つまり、データを別々にグループ化/チャンクすることができますが、単一のストリームに再組み立てすると、データは同一になります。実際のデータは異なっているのか、ちょうど "チャンク"に変わっていますか?後で、画像が同一であればどうして重要なのでしょうか? PNGは無損失タイプの圧縮であり、メタデータを取り除き、画像を伸張+再圧縮してもピクセル値を変更してはいけません。

圧縮されたデータを比較していて、それが同一であることが予想される場合は、異なる可能性があり、同じイメージが生成される可能性があります。これは、FLATE圧縮が反復プロセスを使用して以前のデータで最もよく一致するものを見つけるためです。あなたがそれを与える "品質"番号が高いほど、それは一致を検索し、出力データサイズを縮小するでしょう。 zlibでは、レベル9のデフレート要求がデフォルトより長くなり、出力データサイズが少し小さくなります。

ので、以下の質問に答えてください:

1)あなたは何とかイメージが変更かどうかを確認するためにあなたのストリップの操作の後/前に圧縮されたデータを比較しようとしていますか?もしそうなら、圧縮されたデータを見ることはそれを行う方法ではありません。

2)イメージファイルの他の部分を変更せずにメタデータを削除する場合は、自分でツールを作成する必要があります。実際にはPNGチャンクを歩き、削除したいチャンクをスキップしながら新しいファイルを再構築するのは簡単です。私は、次のコード(PHPのファイルアップロードの一部)が隠れてPHPコード(例えばwebshel​​ls)内のを防ぐことができるかどうかを疑問に思った

は私の質問に答え

と私はより多くの詳細と私の答えを更新します...

+0

あなたの答えをありがとう。 1)ストリップ操作自体はIDATチャンクを変更せず、tEXtチャンクなどを削除するだけです。入力ファイルを正しくフレーズする(実際のピクセルデータは変更されないため)ほかのパラメータを使用して再度収縮させるImagickコンストラクタです(出力ファイルを書き込むため)。私はここでどのパラメータが使用されているかを知りたかったのです(例えば、圧縮レベル、ヒストリバッファ(またはウィンドウサイズ)、圧縮方法)が、PNGを生成した後で(少なくともIDATチャンク内で) Imagickによって処理されます。 – user7390973

+0

ImageMagickを使用して元のファイルを作成した場合、チャンスがある可能性があります。別のツールを使用した場合、同じPNGファイルを生成できないことがあります。メタデータを取り除くだけの場合は、イメージを解凍して再圧縮することはCPU時間のひどい浪費です。さらに悪いことに、ImageMagickは一般に非常に遅い関数群です。これらすべてのパラメータにアクセスする方法はありません。 IMは、zlibと単一のパラメータ(圧縮レベル)を使用して、その浮動小数点データを生成します。 – BitBank

+0

2)これを行うツールを見つける(または書く)のは私の意図ではありませんが、実際には私はその反対を探しています。私はGDでまったく同じことをやったので、この時点では安全ではないことが分かっています(このようなPNGを悪用するには他の脆弱性がなければなりません)。しかし、私がImagickで同じことをすることができなかったという事実だけが、それが不可能であることを証明するわけではありません。だから私は理論的に可能かどうかを明確にするためにこの質問をしました。 – user7390973

0

PNGs

あなたはこれについて考える必要はありません。あなたのサーバにアップロードされているファイルにウェブシェルを隠している人がいるのではないかと心配していると、あなたは何か間違っているのです。

たとえば、PHPパーサーを介してこれらのファイルを提供しています。これは、WebShellを使用してサーバーを攻撃する方法です。 Imagick readmeファイルから

5)直接PHPを呼び出すことなく、Webサーバを介してそれらを提供し、または提供するためのReadFile使用のいずれかの代わりに、PHPを介して直接ユーザーによってアップロードされたファイルを提供しないでくださいそれらはPHP内にあります。

readfileファイルを実行しないと、呼び出しを行わずにエンドユーザーに送信するだけで、攻撃の種類が完全に防止されます。

+0

はい私は全くあなたに同意します。これは私が最後の段落を暗示したかったものです。それにもかかわらず、私はこのトピックに理論的興味を持っています(実用的なアプリケーションはCTFとセキュリティテストかもしれません)。 – user7390973

関連する問題