Я заметил, что PHP Imagick меняет фрагменты IDAT при обработке PNG. Как это делается? Есть ли возможность создавать блоки IDAT, которые остаются неизменными? Можно ли предсказать результат Imagick?PHP Imagick reinterpretation PNG IDAT фрагментов
Справочная информация по этому вопросы: Интересно ли следующий код (часть загрузки PHP-файл) может предотвратить прятался PHP код (например webshells) в формате PNG:
$image = new Imagick('uploaded_file.png');
$image->stripImage();
$image->writeImage('secure_file.png');
Комментарии отрезаются , поэтому единственный способ обойти этот фильтр - это скрытие полезной нагрузки PHP в блоке (-ях) IDAT. Как описано here, теоретически это возможно, но Imagick каким-то образом переинтерпретирует данные изображения, даже если я установил Compression
и CompressionQuality
значениям, которые я использовал для создания PNG. Мне также удалось создать PNG, чей заголовок ZLIB остался неизменным Imagick, но исходных данных сжатого изображения не было. Единственные PNG, в которых я получил идентичный вход и выход, - это те, которые раньше проходили через Imagick. Я также попытался найти причину этого в source code, но не смог найти его.
Я знаю, что другие проверки необходимы, чтобы гарантировать, что загруженный файл на самом деле является PNG и т. Д., И PHP-код в PNG не является проблемой, если сервер настроен правильно, но пока я просто заинтересован в этом выпуске.
Спасибо за ваш ответ. 1) Операция с полосой сама по себе не изменяет фрагменты IDAT, она просто удаляет фрагменты tEXt и т. Д. Это конструктор Imagick, который корректно сбрасывает входной файл (поскольку фактические данные пикселя остаются неизменными), но использует другие параметры, чтобы сдуть его снова (для записи выходного файла). Я хотел бы знать, какие параметры используются здесь (например, какой уровень сжатия, какой буфер истории (или размер окна) и какая стратегия сжатия) для создания PNG, который будет иметь одинаковые двоичные данные (по крайней мере, в блоке IDAT) после того, обработанный Imagick. – user7390973
Если ImageMagick использовался для создания исходного файла, у вас может быть шанс. Если был использован другой инструмент, возможно, вы не сможете создать идентичный файл PNG. Если вы просто удаляете метаданные, то распаковка и повторное сжатие изображения - ужасная трата времени процессора. Хуже того, что ImageMagick, в общем, очень медленный набор функций. Невозможно получить доступ ко всем этим параметрам. В IM используется zlib и один параметр (уровень сжатия) для генерации данных его flate. – BitBank
2) Это не мое намерение найти (или написать) инструмент, который может это сделать, на самом деле я ищу обратное. Мне удалось сделать то же самое с GD, поэтому я знаю, что в этом случае он не является «защищенным» (хотя в эксплоите должны быть другие уязвимости для использования такого PNG). Но только тот факт, что я не мог сделать то же самое с Imagick, не доказывает, что это невозможно. Поэтому я задал этот вопрос, чтобы выяснить, возможно ли это теоретически или нет. – user7390973