PNGを処理するときにPHP ImagickがIDATチャンクを変更することに気付きました。 これはどのように正確に行われますか?変更されないIDATチャンクを作成する可能性はありますか? Imagickの結果を予測することは可能ですか?この質問へPNG IDATチャンクのPHP Imagickの再解釈
背景情報: 私は、次のコード(PHPのファイルアップロードの一部)はPNG画像に隠れPHPコード(例えばwebshells)を防ぐことができるかどうか疑問に思った:
$image = new Imagick('uploaded_file.png');
$image->stripImage();
$image->writeImage('secure_file.png');
コメントが取り除かれこのフィルタをバイパスする唯一の方法は、IDATチャンクにPHPペイロードを隠すことです。 hereで説明したように、理論的には可能ですが、Compression
とCompressionQuality
をPNGの作成に使用した値に設定しても、Imagickはこのイメージデータを再解釈します。また、ZLIBヘッダーがImagickによって変更されていないPNGを作成することもできましたが、圧縮されていないイメージデータは変更されませんでした。同じ入力と出力を持つ唯一のPNGはImagickを前に通過したものです。私もsource codeの理由を見つけようとしましたが、見つけられませんでした。
アップロードされたファイルが実際にPNGなどであることを確認するために、他のチェックが必要であることを知っています。サーバーが正しく設定されていればPNGのPHPコードは問題ありませんが、この問題で。
あなたの答えをありがとう。 1)ストリップ操作自体はIDATチャンクを変更せず、tEXtチャンクなどを削除するだけです。入力ファイルを正しくフレーズする(実際のピクセルデータは変更されないため)ほかのパラメータを使用して再度収縮させるImagickコンストラクタです(出力ファイルを書き込むため)。私はここでどのパラメータが使用されているかを知りたかったのです(例えば、圧縮レベル、ヒストリバッファ(またはウィンドウサイズ)、圧縮方法)が、PNGを生成した後で(少なくともIDATチャンク内で) Imagickによって処理されます。 – user7390973
ImageMagickを使用して元のファイルを作成した場合、チャンスがある可能性があります。別のツールを使用した場合、同じPNGファイルを生成できないことがあります。メタデータを取り除くだけの場合は、イメージを解凍して再圧縮することはCPU時間のひどい浪費です。さらに悪いことに、ImageMagickは一般に非常に遅い関数群です。これらすべてのパラメータにアクセスする方法はありません。 IMは、zlibと単一のパラメータ(圧縮レベル)を使用して、その浮動小数点データを生成します。 – BitBank
2)これを行うツールを見つける(または書く)のは私の意図ではありませんが、実際には私はその反対を探しています。私はGDでまったく同じことをやったので、この時点では安全ではないことが分かっています(このようなPNGを悪用するには他の脆弱性がなければなりません)。しかし、私がImagickで同じことをすることができなかったという事実だけが、それが不可能であることを証明するわけではありません。だから私は理論的に可能かどうかを明確にするためにこの質問をしました。 – user7390973