2017-01-08 18 views
0

Я заметил, что 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 могут варьироваться и по-прежнему воспроизводить идентичное изображение. Спецификация PNG, к сожалению, вынуждает блоки IDAT формировать единый непрерывный поток данных. Это означает, что данные могут быть сгруппированы/разделены по-разному, но при повторной сборке в один поток будет идентичным. Являются ли фактические данные разными или просто изменено «chunking»? Если позже, почему это имеет значение, если изображение идентично? PNG - это сжатие без потерь, удаление метаданных и даже декомпрессия + повторное сжатие изображения не должны изменять значения пикселей.

Если вы сравниваете сжатые данные и ожидаете их идентичности, они могут быть разными и при этом иметь идентичное изображение. Это связано с тем, что сжатие FLATE использует итеративный процесс для поиска наилучших совпадений в предыдущих данных. Чем выше число «качество», которое вы ему даете, тем больше он будет искать совпадения и уменьшать размер выходных данных. С помощью zlib запрос отклонения уровня 9 займет намного больше, чем значение по умолчанию, и приведет к небольшому размеру выходных данных.

Так, пожалуйста, ответьте на следующие вопросы:

1) Вы пытаетесь сравнить сжатых данных до/после операции полосы, чтобы увидеть, если каким-то образом изображение изменилось? Если это так, то просмотр сжатых данных - это не способ сделать это.

2) Если вы хотите лишить метаданные без каких-либо других аспектов изменения файла изображения, вам нужно будет написать инструмент самостоятельно. На самом деле тривиально ходить через куски PNG и собирать новый файл, пропуская куски, которые вы хотите удалить.

Отвечайте на мои вопросы, и я буду обновлять мой ответ более подробно ...

+0

Спасибо за ваш ответ. 1) Операция с полосой сама по себе не изменяет фрагменты IDAT, она просто удаляет фрагменты tEXt и т. Д. Это конструктор Imagick, который корректно сбрасывает входной файл (поскольку фактические данные пикселя остаются неизменными), но использует другие параметры, чтобы сдуть его снова (для записи выходного файла). Я хотел бы знать, какие параметры используются здесь (например, какой уровень сжатия, какой буфер истории (или размер окна) и какая стратегия сжатия) для создания PNG, который будет иметь одинаковые двоичные данные (по крайней мере, в блоке IDAT) после того, обработанный Imagick. – user7390973

+0

Если ImageMagick использовался для создания исходного файла, у вас может быть шанс. Если был использован другой инструмент, возможно, вы не сможете создать идентичный файл PNG. Если вы просто удаляете метаданные, то распаковка и повторное сжатие изображения - ужасная трата времени процессора. Хуже того, что ImageMagick, в общем, очень медленный набор функций. Невозможно получить доступ ко всем этим параметрам. В IM используется zlib и один параметр (уровень сжатия) для генерации данных его flate. – BitBank

+0

2) Это не мое намерение найти (или написать) инструмент, который может это сделать, на самом деле я ищу обратное. Мне удалось сделать то же самое с GD, поэтому я знаю, что в этом случае он не является «защищенным» (хотя в эксплоите должны быть другие уязвимости для использования такого PNG). Но только тот факт, что я не мог сделать то же самое с Imagick, не доказывает, что это невозможно. Поэтому я задал этот вопрос, чтобы выяснить, возможно ли это теоретически или нет. – user7390973

0

Интересно ли следующий код (часть загрузки PHP-файл) может предотвратить прятался PHP кода (например webshells) в PNG

Вам не нужно думать об этом. Если вы беспокоитесь о том, что люди скрывают веб-страницы в файле, который загружается на ваш сервер, вы делаете что-то неправильно.

Например, обслуживая эти файлы с помощью парсера PHP ..., который может быть вызван веб-панель для атаки на сервер.

Из риого файла Imagick:

5) НИКОГДА не напрямую обслуживать любые файлы, которые были загружены пользователями непосредственно через PHP, вместо того, чтобы служить либо их через веб-сервер, не прибегая к PHP или использовать ReadFile, чтобы служить их в PHP.

readfile не выполняет файл, он просто посылает его к конечному пользователю, не прибегая к его, и таким образом полностью предотвращает тип атаки вы, кажется, чтобы быть обеспокоены.

+0

Да, я полностью согласен с вами. Вот что я хотел сказать с моим последним абзацем. Тем не менее у меня есть теоретический интерес к этой теме (практические приложения могут быть CTF и тестирование безопасности). – user7390973

 Смежные вопросы

  • Нет связанных вопросов^_^