Я нашел скрипт PHP в файле GIF - PullRequest
2 голосов
/ 25 июня 2009

Возможно ли, чтобы скрипт PHP находился внутри GIF-файла? Я нашел один, когда я открыл файл .gif в блокноте ++.

Ответы [ 11 ]

19 голосов
/ 25 июня 2009

На самом деле, есть несколько вещей, которые возможны (и обычно используются для таких вещей, как счетчики посещений).

Учтите это:

<img src="myPicture.php" />

myPicture.php может выглядеть так:

<?php
// Use PHP's GD image libraries.

// Create the image
$my_img = imagecreate( 200, 80 );

// set image attributes

// Set the header to indicate we're sending image data, rather than ASCII
header( "Content-type: image/png" );

// Output the image
imagepng( $my_img );

// cleanup
?>

Итак, вывод вашего PHP-скрипта - это не текст ASCII (или HTML), а двоичный файл .png файла. Таким образом, header () устанавливается для указания этого, и показанные функции imagepng () фактически выводят необработанные данные изображения PNG. (пример взят из здесь ).

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

<img src="myPicture.png" />

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

8 голосов
/ 25 июня 2009

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

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

6 голосов
/ 25 июня 2009

Как системный администратор, когда я нахожу PHP-скрипты с расширением изображения (.gif, .jpg, .png) , это обычно означает , что кто-то проник в приложение PHP и скрывается вредоносный код внутри этого файла.

Их код можно выполнить, вызвав PHP CLI или просто включив файл из любого другого сценария PHP. Помните, что include и require действительно не заботятся об имени файла. Последний является наиболее распространенным случаем, который я видел.

Вам необходимо проверить сам код и посмотреть, что он делает. Не запускайте, сначала прочитайте .

4 голосов
/ 25 июня 2009

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

Ситуация потребовала бы apache, чтобы php обрабатывал расширение файла gif. Затем php внутри файла будет выполнять любые проверки, а затем отправлять заголовки для типа mime изображения / gif, размера файла и т. д., а затем выводить файл с file_get_contents (или аналогичным методом)

2 голосов
/ 25 июня 2009

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

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

2 голосов
/ 25 июня 2009

Поиск php в gif-файле может указывать на то, что кто-то пытается атаковать ваш сервер. Это интересное прочтение о безопасной загрузке файлов и php.

2 голосов
/ 25 июня 2009

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

Доброкачественный случай : скрипт действительно предназначен для вывода изображения GIF, и вместо этого вы получили код из-за неправильной конфигурации сервера. Это может произойти, если:

  1. автор неправильно набрал команду в файле .htaccess, чтобы рассматривать все GIF-файлы или этот конкретный файл как PHP
  2. вебмастер переписал .htaccess с отсутствием указанных инструкций
  3. администратор сервера поместил AllowOverride none в свой httpd.conf, отключив все настройки пользовательского пространства

Я бы посмотрел на тип функций, используемых в коде. Предположительно, это файл GIF, и я ожидаю, что скрипт завершится инструкцией imagegif($img) или около того, возможно, за ней последует imagedestroy($img). В этом случае сценарий, скорее всего, предназначен для вывода изображений GIF в браузер.

Злой случай : кто-то загрузил кучу хакерских вещей, маскируемых под GIF, ожидая, что позже запустит его, используя любой метод, который может дать ему доступ к командной строке: незащищенный eval(), дыра в другом месте на сервере или даже уязвимость в абсолютно не связанном демоне, работающем на той же машине. Его преимуществом в этом случае будет то, что скрипт будет храниться в известном месте, полученном из корня сервера. Существуют сценарии, которые включают в себя полный файловый менеджер и наборы утилит в одном пакете - просто для того, чтобы создать хаос. Опять же, посмотрите на источник: если он начинается с шебанга (что-то вроде #!/bin/php /usr/htdocs/myfakeimagefile.gif), он определенно должен запускаться из командной строки. Отсутствие shebang, однако, не означает, что его нельзя запускать как скрипт: если известно, где находится PHP, где находится скрипт и он может получить доступ к командной строке, возможно, все равно можно его запустить.

2 голосов
/ 25 июня 2009

Я видел, как это делается (хотя обычно с расширением .jpg) для обслуживания изображений из базы данных ...

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

1 голос
/ 20 декабря 2009

Вы можете конвертировать в формат "bmp" и обратно - для очистки скриптов внутри метаданных ваших загруженных изображений. Bmp не имеет метаданных, но имеет альфа-прозрачность и 100% качество. В PHP вы можете использовать класс imagick:

/*
Cleanup injected scripts from imagick object "$insecure", making object safe next manipulations.
*/
function MakeImageSafe($insecure) {
  global $configuration,$dic,$smarty;
  $ImageMETAFormat=strtolower($insecure->getImageFormat());
  $ImageMETAName=$insecure->getFilename();
  //convert to bmp to remove injected php/js... and
  if($ImageMETAFormat!="gif") {
    $insecure->setImageFormat("bmp");
    $insecure->writeImage("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
    //get secure image
    $original=new Imagick("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
    //delete temporary bmp
    unlink("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
  }
  else {
    // convert each frame in animated gif and recreate the gif
    $original=new Imagick();
    foreach($insecure as $frame) {
      $frame_delay=$frame->getImageDelay();
      //get timing
      $frame_page=$frame->getImagePage();
      //get offsets and geometry of the frames
      $frame->setImageFormat("bmp");
      $frame->writeImage("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
      $safeframe=new Imagick("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
      $safeframe->setImageDelay($frame_delay);
      $safeframe->setImagePage($frame_page['width'],$frame_page['height'],$frame_page['x'],$frame_page['y']);
      $safeframe->setImageFormat("gif");
      $original->addImage($safeframe->getImage());
      unlink("{$configuration['tmp_path']}/{$ImageMETAName}.bmp");
    }
  }
  //return safe object
  return $original;
}

Большинство веб-сайтов с изображениями допускают включение сценариев в изображения: например, flickr, livejournal или конвертирование изображения в какой-либо плохой формат, например jpeg - например, google и т. Д. Этот сценарий устраняет эту проблему. Ваши комментарии приветствуются! :) Ура, Мэтт.

0 голосов
/ 25 июня 2009

Вы всегда можете использовать мод переписать, чтобы изменить расширение файла, если это то, что вы получили?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...