【发布时间】:2023-12-02 09:11:01
【问题描述】:
我注意到 PHP Imagick 在处理 PNG 时会更改 IDAT 块。 这究竟是如何完成的?是否有可能创建保持不变的 IDAT 块?是否可以预测 Imagick 的结果?
此问题的背景信息: 我想知道以下代码(PHP 文件上传的一部分)是否可以防止在 PNG 中隐藏 PHP 代码(例如 webshell):
$image = new Imagick('uploaded_file.png');
$image->stripImage();
$image->writeImage('secure_file.png');
评论被删除,因此绕过此过滤器的唯一方法是将 PHP 有效负载隐藏在 IDAT 块中。如here 所述,理论上是可能的,但即使我将Compression 和CompressionQuality 设置为我用来创建PNG 的值,Imagick 也会以某种方式重新解释此图像数据。我还设法创建了一个 PNG,其 ZLIB 标头由 Imagick 保持不变,但原始压缩图像数据没有。我获得相同输入和输出的唯一PNG是之前通过Imagick的PNG。我也尝试在source code中找到原因,但找不到。
我知道其他检查是必要的,以确保上传的文件实际上是 PNG 等,如果服务器配置正确,PNG 中的 PHP 代码没有问题,但现在我只对这个问题。
【问题讨论】:
标签: php imagemagick png zlib imagick