Я проснулся и обнаружил, что во всех папках моего shared-web-host с правами доступа 777 есть два новых php-файла. Код внутри файла не удалось прочитать — вот расшифрованная версия:http://pastie.org/779226(что за...?) Этот код был внедрен даже в некоторые PHP-файлы.
Я в недоумении, КАК кто-то мог это сделать? Я знаю, что иметь разрешение 777 — не самая умная вещь, но как они вообще попали в мою систему папок.
Я всего лишь программист клиентской части, и было бы здорово, если бы я дал вам совет, как избежать подобных ситуаций в будущем.
Ваше здоровье.
решение1
Вот деобфусцированная версия скрипта:http://pastie.org/private/iobgt7aetg8mezoepucsg
Похоже, код включает в себя внешний PHP-код с другого веб-сайта и при этом собирает информацию о ваших посетителях.
Один из способов, которым это могло произойти, заключается в том, что вы разрешаете загрузку файлов в каталог, доступный извне. Делать это без надлежащей проверки опасно, поскольку злонамеренный пользователь может загрузить файл PHP (используя вашу загрузку изображения) с вредоносным кодом. Если веб-сервер не настроен должным образом, код будет запущен по запросу.
Чтобы избежать подобных проблем, убедитесь, что:
- Процессы PHP запускаются пользователем с ограниченными правами.
- Файлы, которые не нужно редактировать, доступны для записи только владельцу (0644 или 0744 в зависимости от того, требуется ли вам бит выполнения или нет).
- Только сделайте каталог загрузки доступным для записи.
- Попробуйте использовать каталог загрузки, который находится вне вашего веб-корня. Затем используйте
readfile()
для обслуживания файла. - Проверьте файлы. Если вы хотите, чтобы ваша форма допускала только изображения, проверьте магические биты и убедитесь, что изображение является допустимым. Это очень часто упускаемый из виду шаг. То же самое относится к любому другому формату. Не полагайтесь на расширение файла или тип MIME, отправленные клиентом. Проверьте фактическое содержимое файла.
решение2
Мне приходит в голову по крайней мере два варианта:
- Они нашли ваш пароль FTP
- Они обнаружили уязвимость в вашем программном обеспечении PHP
Чтобы предотвратить их возникновение:
- Используйте сложный пароль (минимум 9 символов, смешанный регистр, цифры и специальные символы)
- Запустите 777, как будто это число зверя; попробуйте дать веб-серверубольше не надочем разрешения на чтение для ваших скриптов, и предоставьте особые разрешения для (надеюсь, редких) папок/файлов, куда ему придется писать.
Если у вас есть доступ к некоторым журналам (журналам доступа Apache и журналам FTP с любого FTP-сервера, на котором работает ваш сайт), это может оказаться полезным для понимания того, что произошло.
Сомнительно, что им удалось внести так много изменений с помощью простой ошибки в ваших скриптах, если только это не действительно широко распространенная ошибка (например, у вас есть незащищенный скрипт, оборачивающий fopen() только над тем, что нравится пользователю), поэтому я бы в первую очередь проверил журнал FTP.