Как запретить людям загружать GIF-файлы с инъекциями?

У меня есть веб-сайт PHP, на котором люди могут заполнять заявки на помощь. Это позволяет им загружать скриншоты для своего билета. Я разрешаю загружать gif, psd, bmp, jpg, png, tif. Получив загрузку, PHP-скрипт игнорирует расширение файла. Он идентифицирует тип файла, используя только информацию MIME, которая для этих типов файлов всегда хранится в пределах первых 12 байтов файла.

Кто-то загрузил несколько GIF-файлов, которые при просмотре в браузере показывали, что они недействительны, а мой антивирусный сканер предупредил меня, что это инъекция (или что-то в этом роде). См. ниже zip-файл, содержащий эти GIF-файлы.

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

Итак, у меня есть два основных вопроса:

  1. Кто-нибудь знает, как они внедрили плохие вещи в GIF ( при сохранении допустимого типа GIF MIME)? Если я это знаю, возможно, я смогу проверить это во время загрузки.
  2. Как я могу запретить кому-либо загружать подобные файлы?
    • Я нахожусь на виртуальном хостинге, поэтому не могу установить вирус на стороне сервера сканер.
    • Отправка информации на веб-сайт онлайн-сканирования вирусов может быть слишком медленным.
    • Есть ли способ проверить себя, используя класс PHP, который проверяет эти вещи?
    • Не удастся ли изменить размер изображения с помощью GD, если оно недействительно? Или эксплойт все равно проскользнет и будет на изображении с измененным размером? Если это не удастся, это было бы идеально, потому что тогда я мог бы использовать изменение размера как метод, чтобы увидеть, действительны ли они.

Обновление:Всем спасибо за ответы. Я пытаюсь найти на сервере загруженные GIF-файлы. Я обновлю этот пост, если найду их.

Обновление 2:Я нашел GIF-файлы для всех, кто заинтересован. Я поместил их в zip-файл, зашифрованный паролем «123». Он находится здесь (будьте осторожны, на этом хостинге есть несколько кнопок «Скачать» — некоторые из них предназначены для рекламы) http://www.filedropper.com/badgifs. Тот, что называется 5060.gif, помечается моим антивирусом как троян (TR/Graftor.Q.2). Я должен отметить, что эти файлы были загружены до того, как я реализовал проверку MIME первых 12 байтов. Так что теперь я в безопасности для этих конкретных. Но я все же хотел бы знать, как обнаружить эксплойт, скрывающийся за правильным типом MIME.


Важное уточнение:Меня беспокоит только риск для ПК, который загружает эти файлы для просмотра. Файлы не представляют опасности для моего сервера. Они не будут казнены. Они хранятся с использованием чистого имени (шестнадцатеричный хеш-выход) с расширением «.enc" и сохраняю их на диск в зашифрованном виде с помощью фильтра fwrite:

// Generate random key to encrypt this file.
$AsciiKey = '';
for($i = 0; $i < 20; $i++)
    $AsciiKey .= chr(mt_rand(1, 255));

// The proper key size for the encryption mode we're using is 256-bits (32-bytes).
// That's what "mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)" says.
// So we'll hash our key using SHA-256 and pass TRUE to the 2nd parameter, so we
// get raw binary output.  That will be the perfect length for the key.
$BinKey = hash('SHA256', '~~'.TIME_NOW.'~~'.$AsciiKey.'~~', true);

// Create Initialization Vector with block size of 128 bits (AES compliant) and CBC mode
$InitVec = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$Args = array('iv' => $InitVec, 'key' => $BinKey, 'mode' => 'cbc');

// Save encoded file in uploads_tmp directory.
$hDest = fopen(UPLOADS_DIR_TMP.'/'.$Hash.'.enc', 'w');
stream_filter_append($hDest, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $Args);
fwrite($hDest, $Data);
fclose($hDest);

18
задан Lakey 2 June 2012 в 21:56
поделиться