My ad server has been hacked over the weekend.
It seems to be a widespread problem, according to this article.
There is something in there that got me thinking...
Attackers used one attack to get login rights to his server, and then uploaded a maliciously encoded image that contained a PHP script hidden inside it, he said. By viewing the image, attackers forced the script to выполнить на сервере
Как это возможно? Это полагается на изображение, открываемое с GD или подобным? Загружают ли они сценарий, изображающий из себя изображение, и каким-то образом включают его?
Это может быть так же просто, как загрузить файл, например
GIF89a<?php
echo 'hi';
Если ваш скрипт загрузки проверяет тип контента с помощью fileinfo или mime_content_type()
, он распознается как «данные изображения GIF». , версия 89a", поскольку GIF89a
является единственным шаблоном/магическим номером, который требуется для идентификации файла как gif.
А скрипт загрузки OpenX видимо сохранил предложенное имя файла, т.е. можно было сохранить это "изображение" как foo.php на сервере. Теперь, если вы запрашивали этот файл через http://hostname/uploaddir/foo.php
, сценарий выполнялся как php-скрипт, потому что веб-серверы обычно/часто определяют тип содержимого только по расширению имени файла, например. Затем via
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php повторяет начальный GIF89a
и выполняет блок .
Помещение блока
Ваш сервер анализирует этот файл по какой-то причине. Злоумышленники вставляют PHP в комментарий к изображению.
Как вы проверяете, является ли файл изображением? Если вы делаете это исключительно на MIME-типе, то я считаю, что они могут подделать заголовок изображения и включить после этого все, что захотят. У VolkerK есть практический пример
В идеальном мире я бы не стал публиковать любые общедоступные изображения через PHP, опасаясь такой проблемы.
Подавать изображение напрямую с помощью сервера; Хорошим предложением является сохранение этих изображений в каталоге, где их можно будет обслуживать без PHP.
Я думаю, что суть в этом, кто-нибудь поправьте меня, если я ошибаюсь.
Единственная возможность, которую я вижу для компрометации сервера, заключается в том, что изображение include
d вместо чтения, например. readfile
и другие потоковые функции.