2010-05-17 2 views
2

К моему вниманию, пользователь пытается создать эксплойт через загрузку изображений аватаров. Это было обнаружено, когда пользователь сообщил мне, что они получали уведомление от своего антивируса Norton, говорящего «HTTP Suspicious Executable Image Download». Это предупреждение ссылалось на изображение аватара пользователя. Я не думаю, что они на самом деле ничего не добились, чтобы украсть информацию или что-то в этом роде, но я предполагаю, что это возможно, если дыра остается открытой достаточно долго. Я использую PHP для загрузки файлов изображений, и я проверяю, загружен ли файл png, jpg, bmp или gif.Загрузка блока исполняемых изображений (PHP)

Это код, который проверяет, является ли это изображение:

$allow_types = array('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap'); 
if (in_array($this->tmp_image['type'], 
$this->allow_types)) { 
    return true; 
} 

ответ

6

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

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

Существует так много способов комбинировать изображения и вредоносные файлы. Вредоносный файл может быть исполняемым или содержать JavaScript, который интерпретируется браузером. Кроме того, как вы должны повторно сохранять файлы, которые не являются типом изображения?

При обработке загрузки файлов необходимо позаботиться о следующем.

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

  • Ограничить количество файлов для загрузки на одного пользователя, чтобы ваш сервер не закончил inode.

  • Сохраните файлы над корнетом вашего документа, чтобы они не были доступны напрямую.

  • Подавайте ваши файлы через PHP-прокси сценарий, написать что-то вроде:

    $data = file_get_contents('/home/account/files/file.png'); 
    header('Content-Type: image/png'); 
    header('Content-Length: '. strlen($data)); 
    header('X-Content-Type-Options: nosniff'); 
    echo $data; 
    
  • Rename загруженных файлов, чтобы иметь полностью случайное имя без расширения. Если вам нужно сохранить имя файла (и расширение/тип), сохраните данные в базе данных.

  • При необходимости отправьте файлы только в том случае, если у пользователя есть разрешение на его использование.

  • Никогда не включайте и не выполняйте загруженные файлы. Это означает, что в PHP не требуется или не требуется. Нет тегов HTML-тегов или тегов стилей, включая их. Никаких команд Apache Include, включая их. И так далее.

  • Если возможно, подавайте файлы с другого источника. Это устраняет проблемы происхождения, возникающие в основном в Flash. Использование другого порта, доменное имя или IP-адрес также прекрасны.Обслуживание из поддоменов опасно, и с IP-адресами реализация становится немного сложнее (т. Е. Вы не можете обслуживать файлы через домен, только через IP-адрес, и вы не можете обслуживать сайт через IP-адрес, а через домен).

  • Остерегайтесь LFI и RFI. Переименуйте имена файлов, прежде чем использовать имя файла в таких функциях, как fopen(), read() и т. Д. И при необходимости проверьте/дезинформируйте любые значения каталога.

0

использования imagecreatefromjpeg (и других imagecreatefrom *), чтобы проверить, что передаваемые данные реального изображения. exe не пройдет.

+1

getimagesize, вероятно, лучшим вариантом, поскольку он не будет загружать ресурс. – buggedcom

2

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

+0

resave - чрезмерная работа. если он замаскирован exe, он не сработает при открытии – Andrey

+2

Это не чрезмерная операция. Некоторые форматы файлов (в основном, gif) позволяют вставлять данные без изображения в файл. Единственный способ надежно избавиться от этого - загрузить и повторно сохранить. – ircmaxell

+0

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

0

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

видеть эту ссылку http://www.bitrepository.com/how-to-validate-an-image-upload.html

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