Можно ли вводить php-оболочку в изображение? Как это будет работать?

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

Я делаю свою собственную загрузку изображений script, и я предполагаю, что мне придется защищаться от этой возможности. Кроме того, я понятия не имею, как это будет работать. Кто-нибудь знает, как оболочка php, спрятанная внутри изображения, будет выполняться сама? Нужно ли его загружать определенным образом?

Спасибо.

Ответ 2

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

include('templates/' . $_GET['page']);

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

Убедитесь, что getimagesize() не возвращает значение false, использует произвольное имя файла и принудительно применяет расширение файла. Если это вообще возможно, не сохраняйте загруженное изображение в доступном в Интернете месте, так как оно также может содержать JS и, следовательно, быть вектором XSS.

Повторное кодирование изображения также позволяет вам удалять неприятные метаданные и мусор в конце, который разрешен несколькими форматами (например, JPEG).

Ответ 3

Есть несколько способов защитить себя от таких трюков. Проверьте их здесь

Также прочтите эту статью, в которой объясняется атака и способы ее устранения.

Главное в этом состоит использование basename функции php для отсрочки таких атак.

Ответ 4

Я знаю, что способ (или был) способ сохранить php файл как .gif и запустить его. В эксплоите, который я видел на странице загрузки, тип mime был установлен как GIF, и изображение было загружено чем-то вроде: require('myimage.gif'); Когда myimage.gif был фактически файлом PHP, переименованным в .gif, включая файл выполнил бы полезную нагрузку php, иначе файл был просто нормальным gif. Я видел этот эксплойт для загрузки script, хакер также отредактировал hex myimage.gif так, чтобы байты 47 49 46 38 39 предшествовали остальной части файла. Эти байты представляют собой заголовок GIF и будут обманывать PHP, думая, что файл был GIF, позволяя загружать файл PHP в обход проверки типа файла "вперед". Это можно было бы легко устранить, построив лучшую проверку файлов, чтобы убедиться, что весь файл является законным. Самый простой способ, который я могу придумать, - попытаться загрузить изображение с помощью GD и посмотреть, есть ли у него ошибка. Я не думаю, что GD выполнит полезную нагрузку PHP, но я не уверен, вам придется протестировать. Я предполагаю, что почти один и тот же эксплойт был выполнен или может быть выполнен для tiff или любого типа файла.

Чтобы убедиться, что ваш script не используется, выполните следующие действия.

1) Задайте несколько типов файлов, которые вы можете сделать Array('.png', '.jpg', '.txt', 'etc'), если его не в массиве НЕ разрешить. Даже если вы запретили .php, там все еще .php3, .php5 и т.д., Которые работают на некоторых серверах.

2) Gaard против myimage.php.gif, сохраняя загруженный файл в md5 (или имя rand) имени файла (исключая тип файла), поэтому myimage.php.gif станет ef0ca703846cdb7a0131ac2889304a27.gif

3) Проверьте целостность файла, убедитесь, что заголовок и остальная часть файла являются допустимыми.

4) Не используйте require('myimage.gif'); вместо печати

Ответ 5

Если вы используете только функции GD для управления изображениями, вы должны быть в порядке. Чтобы быть в безопасности, вы можете конвертировать все входящие изображения в конкретный формат, который вы можете считать "безопасным" (мне нравится PNG или JPG, в зависимости от того, является ли вывод вывода браузером или каким-то высоким качеством -Распечатать). Кроме того, никогда не используйте имя imoage, предоставленное пользователем в вашей собственной файловой системе. Таким образом, он не сможет помещать странные данные в имя файла. Чтобы быть более безопасным, вы можете использовать утилиту преобразования imagemagik командной строки. Это быстрее и безопаснее.

Ответ 6

Я не знаю об этом конкретном эксплойте, но, как правило, использует такие функции, используя ошибки в программном обеспечении, которое загружает изображение. Если PHP или, точнее, библиотека, загружающая изображение TIFF, выделяет неправильный объем памяти для хранения изображения, он может попытаться загрузить изображение в меньшем объеме памяти, чем зарезервировано. Это называется переполнением буфера.

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

Эти проблемы могут возникнуть, если в библиотеке изображений есть ошибка. Я думаю, что такая ошибка существует для GIF в IE 5. Объем выделенной памяти не определялся фактическим размером файла, а информацией о размере файла в заголовке файла. Это позволило людям создавать коррумпированные файлы gif, заканчивая фрагментом кода, который был написан в сегменте кода процесса и может быть выполнен.

Ответ 7

Если у вас нет серьезной ошибки в обработке изображений PHP, я не вижу, как PHP-код в изображении может когда-либо интерпретироваться, просто работая с ним или отображая его.

Однако существуют способы использования изображений для атак типа Cross-Site-Scripting для пользователей, использующих Internet Explorer.

Также вам нужно быть осторожным, чтобы пользователи не могли загружать изображения, которые будут использоваться в качестве ввода PHP. Например. быть включенным() d по какой-либо причине или загружаться с расширением .php.

Apache Multiviews может даже привести к тому, что изображения с именами, как image.php.jpg, будут выполнены при некоторых обстоятельствах (хотя я не уверен в этом).

Ответ 8

Мне пришло в голову блестящее решение.
Если вы храните свои изображения на отдельном сервере/домене/CDN/независимо от того, у вас нет прямого доступа к вашему коду, вы выполнили свою миссию!

Ответ 9

Да, может. Создайте файл tif (php-code.tif) со следующим кодом

<?php 

  die("TIF file malicious code works");

Затем в другой script make include 'php-code.tif';

Посмотрите сами, что происходит...

Да, это означает, что злоумышленник имеет доступ к вашему серверу или вы сами загрузили файл в качестве темы или плагина для cms... oups!


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

Ответ 10

Вы можете закодировать веб-оболочки в png-изображение, если вы сделаете это правильно, он также сможет пережить повторное кодирование.

есть посмотреть на это