Как веб-сайт взломан "злонамеренно закодированным изображением, в котором скрыт PHP-скрипт"?
Мой рекламный сервер был взломан в минувшие выходные.
Похоже, что это широко распространенная проблема, согласно этой статье.
Там есть кое-что, что заставило меня задуматься...
Злоумышленники использовали одну атаку, чтобы получить права на вход на его сервер, а затем загрузили злонамеренно закодированное изображение , которое содержало скрытый в нем PHP-скрипт, сказал он. Просмотрев изображение, злоумышленники заставили скрипт выполняться на сервере
Как возможно ли это? Зависит ли это от изображения, открываемого с помощью GD или аналогичного? Загружают ли они скрипт, выдающий себя за изображение, и каким-то образом включают его?
3 answers
Это может быть так же просто, как загрузить файл, например
GIF89a<?php
echo 'hi';
Если ваш скрипт загрузки проверяет тип контента с помощью fileinfo или mime_content_type()
, он распознается как "данные изображения GIF, версия 89a", поскольку GIF89a
является единственным шаблоном/магическим числом, которое требуется для идентификации файла как gif.
И скрипт загрузки OpenX, по-видимому, сохранил предложенное имя файла, т. Е. Можно было сохранить это "изображение" как foo.php на сервере. Теперь, если вы запросили этот файл через http://hostname/uploaddir/foo.php
, сценарий был выполняется как php-скрипт, потому что веб-серверы обычно/часто определяют тип контента только по расширению имени файла, например, через
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
Затем Php повторяет начальный GIF89a
и выполняет блок <?php ...code...
.
Поместить блок
Ваш сервер анализирует этот файл по какой-либо причине. Злоумышленники вставляют PHP в комментарий к изображению.
Как вы проверяете, является ли файл изображением? Если вы делаете это исключительно по типу mime, то я полагаю, что они могут подделать заголовок изображения и включить все, что захотят после этого. У Фолькерка есть практический пример
В идеальном мире я бы не обслуживал любые общедоступные изображения через PHP, опасаясь такой проблемы.
Подавать изображение напрямую использование сервера; Хорошим предложением является сохранение этих изображений в каталог, где они могут быть предоставлены без PHP.
Я думаю, в этом вся суть, кто-нибудь поправьте меня, если я ошибаюсь.
Единственная возможность, которую я вижу для компромисса с сервером, - это то, что изображение include
d вместо чтения, например, readfile
и других потоковых функций.