Безопасность сайта

Хостер заблокировал сайт за вирусы: как разблокировать быстро

Аккаунт отключён, сайт недоступен, письмо с отчётом антивируса. Что делать по шагам, как чистить и как правильно писать в поддержку.

13 минут чтения 0 Дмитрий Акиндинов
Содержание
  1. Почему хостер выключает сайт и почему это в ваших интересах
  2. Первые тридцать минут: что сделать до любой чистки
  3. Читаем отчёт антивируса
  4. Как получить доступ к файлам, когда сайт отключён
  5. Порядок чистки, который работает
  6. Заявка на разблокировку: что приложить, чтобы не ходить по кругу
  7. Если это ложное срабатывание
  8. Сколько это занимает по времени
  9. После разблокировки: чек-лист на один вечер
  10. Сколько стоит и когда звать человека
  11. Частые вопросы

После блокировки за вирусы сайт разблокируют в среднем за сутки, а сама чистка занимает 6-16 часов для сайта с кастомной темой. Начинать надо не с чистки, а со снятия грязной копии и чтения отчёта антивируса: в нём уже есть список заражённых файлов.

Утром сайт не открывается, вместо страниц заглушка провайдера, а в почте письмо: аккаунт приостановлен, обнаружено вредоносное ПО, список файлов во вложении. Дальше обычно начинается паника, звонки в поддержку и эмоциональные письма, которые не ускоряют ровно ничего. Ситуация, когда хостинг заблокировал сайт за вирусы, лечится по регламенту: есть понятный порядок шагов, который вытаскивает проект из блокировки за несколько часов, а не за неделю. Ниже разбор: как читать отчёт антивируса, чем и в каком порядке чистить, что именно приложить к заявке на разблокировку и что сделать после, чтобы не приехать сюда снова через месяц.

Заблокированный сервер с меткой вируса и инструментом для чистки

За шесть лет абонентки я разбирал такие блокировки на Timeweb, Beget, Reg.ru, Sprinthost и на паре VPS с ISPmanager. Сценарий везде одинаковый до скуки, разница только в формулировках писем и в скорости ответа поддержки.

Почему хостер выключает сайт и почему это в ваших интересах

Shared-хостинг это общий сервер, где ваш сайт живёт рядом с сотней чужих. Когда на аккаунте заводится вредонос, страдает не только владелец. Заражённый сайт начинает рассылать спам с серверного IP, и весь сервер уезжает в списки Spamhaus. Скрипты майнера съедают CPU, из-за чего тормозят соседи. Фишинговая папка вида /wp-content/uploads/2026/04/sber-login/ приносит абузу от банка и жалобу в Safe Browsing, а следом хостера дёргает его собственный апстрим.

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

Блокировки бывают трёх видов, и от вида зависит, что вам вообще доступно:

  • сайт отдаёт заглушку, но панель, FTP и SSH работают. Самый частый и самый удобный случай: лечите спокойно;
  • аккаунт заморожен целиком, доступа нет нигде. Так реагируют на рассылку спама и фишинг, то есть на то, за что хостер уже получил абузу;
  • предупреждение без блокировки: письмо с отчётом и дедлайном в 24-72 часа. Это подарок, а не угроза, потому что чистить работающий сайт вдвое проще.

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

Первые тридцать минут: что сделать до любой чистки

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

Порядок такой:

  1. Сделать снимок текущего состояния, вместе с заразой. Это ваша единственная возможность потом откатиться и разобраться.
  2. Сохранить письмо хостера и отчёт антивируса отдельным файлом. В нём даты, а даты дальше понадобятся.
  3. Проверить, какие бэкапы есть и на какое число. Штатные копии хостера обычно хранятся 7-30 дней, этого хватает.
  4. Сменить пароль от панели управления и от FTP прямо сейчас. Если доступ утёк, чистка без смены пароля бессмысленна: вернут обратно за сутки.
  5. Остановить рекламные кампании, если они идут. Директ будет исправно жечь бюджет на заглушку хостера.
# снимок ДО любой чистки, вместе с вредоносом
cd ~
tar czf before-clean-$(date +%F).tar.gz public_html
mysqldump -u USER -p DBNAME > db-before-clean-$(date +%F).sql

# php-файлы, изменённые за последние 14 дней: типичное окно заражения
find public_html -type f -name "*.php" -mtime -14 
  -printf "%TY-%Tm-%Td %TH:%TM  %pn" | sort

# классические маркеры веб-шелла
grep -rEl "eval[[:space:]]*(|base64_decode[[:space:]]*(|gzinflate[[:space:]]*(|preg_replace[[:space:]]*(.*/e" 
  public_html --include="*.php"

# php в папке загрузок: его там быть не должно вообще
find public_html/wp-content/uploads ( -name "*.php" -o -name "*.phtml" )

Последняя команда закрывает половину случаев. Каталог uploads доступен на запись для веб-сервера, и именно туда падает первый шелл после эксплуатации дырявого плагина загрузки файлов. Что с этим делать подробнее, я разбирал в статье про шелл в папке uploads.

Читаем отчёт антивируса

Хостеры сканируют разными движками: ImunifyAV на серверах с cPanel и ISPmanager, AI-Bolit у российских провайдеров, реже ClamAV с самописными сигнатурами. Отчёт приходит либо простыней в теле письма, либо HTML-файлом с деревом путей и вердиктами.

Читать его нужно по колонке вердикта, а не по количеству строк. Пятьсот детектов не значит, что сайт мёртв: часто это один шелл, размноженный по всем каталогам темы автоматом.

Вердикт в отчётеЧто это на самом делеЧто делать
PHP.Shell, CriticalPHPвеб-шелл, полноценная панель управления файламив карантин немедленно, вектор искать обязательно
Backdoor.PHP.Genericзакладка для повторного входа, часто в wp-config.php или в конце functions.phpвырезать вставку, файл сверить с оригиналом
SEO.Spam, Redirectorинъекция ссылок или редирект на мобильных, живёт в БД и в шаблонечистить и файлы, и таблицы wp_posts с wp_options
JS.Injectionвставка в .js темы или в подключаемый скриптзаменить файл из дистрибутива, проверить остальные
Phishing.HTMLчужая страница логина в вашем uploadsудалить каталог целиком, сообщить хостеру отдельно
HEUR, SuspiciousPHPэвристика, вердикта по сути нетсверять с оригиналом, чаще всего это ложное срабатывание

Ложные срабатывания дают минифицированные скрипты, base64-спрайты в CSS, лицензионные проверки премиум-тем (там реально бывает обфускация), кэш-файлы плагинов и объёмные .htaccess. Отличить честно и быстро помогают контрольные суммы:

wp core verify-checksums                 # ядро WordPress против эталона
wp plugin verify-checksums --all         # плагины из официального каталога

Если файл не проходит проверку и лежит в wp-includes, разговор окончен: это правка ядра, ядро надо менять. Если сумма совпала, а антивирус ругается, у вас ложное срабатывание, и его надо не удалять, а объяснять поддержке.

Как получить доступ к файлам, когда сайт отключён

Варианты по убыванию удобства:

  • SSH, если тариф с shell. Все команды выше работают, чистка идёт в разы быстрее;
  • файловый менеджер панели. Медленно, зато доступно почти всегда, даже когда сайт отдаёт заглушку;
  • SFTP плюс локальная копия. Качаете, чистите на машине, заливаете обратно. Для сайта на пару гигабайт uploads это часы, поэтому качайте без uploads, отдельно проверив его командой выше;
  • временная разблокировка по запросу. У Beget и Timeweb это штатная процедура: пишете, что приступаете к лечению, просите доступ к панели и SSH на сутки. Отвечают, как правило, в течение часа-двух в рабочее время.

Чего делать не стоит: переносить заражённый сайт на другой хостинг, чтобы он пока работал. Вы получите вторую блокировку у нового провайдера и репутацию клиента, который возит абузу. Восстанавливать бэкап месячной давности вслепую тоже так себе идея: заражение часто старше, чем кажется, и вы просто вернёте шелл вместе с контентом. Дату для отката берут из логов, а не из ощущений.

Порядок чистки, который работает

Карантин вместо удаления

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

mkdir -p ~/quarantine
rsync -R public_html/wp-content/uploads/2026/04/about.php ~/quarantine/
rm public_html/wp-content/uploads/2026/04/about.php

Замена ядра и плагинов на заведомо чистые

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

cd ~
wget https://ru.wordpress.org/latest-ru_RU.tar.gz
tar xzf latest-ru_RU.tar.gz
rm -rf public_html/wp-admin public_html/wp-includes
cp -a wordpress/wp-admin wordpress/wp-includes public_html/
cp -a wordpress/wp-*.php public_html/     # wp-config.php свой, его не перезаписываем

Плагины из каталога переустанавливаются одной строкой, без потери настроек (настройки лежат в БД):

wp plugin list --field=name | xargs -n1 -I{} wp plugin install {} --force

Отдельная боль это нулёные темы и премиум-плагины, скачанные с торрента. Заменить их не на что, а именно в них чаще всего и сидит закладка от того, кто выложил сборку. Здесь выбор простой: покупать лицензию или выпиливать. Третьего варианта нет, я пробовал.

Разбор того, что осталось

После замены ядра остаются своя тема, uploads, корень сайта и wp-content. Смотреть по списку:

  • wp-config.php: посторонние include и eval в конце файла, base64-строки, лишние определения констант;
  • корневой index.php: он должен быть в две строки, всё сверх этого чужое;
  • .htaccess в корне и в uploads: редиректы по User-Agent, разрешение исполнять php в загрузках;
  • wp-content/mu-plugins/: каталог создаётся вредоносом сам, если его никто не заводил специально;
  • drop-in файлы object-cache.php, advanced-cache.php, db.php в wp-content: подключаются раньше плагинов и потому любимы бэкдорами;
  • functions.php темы: обычно закладка в самом конце файла, после пустых строк.

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

База данных

Файлы вычищены, а редирект на мобильных остался. Значит, инъекция в БД:

SELECT option_name, LEFT(option_value, 80) AS preview
FROM wp_options
WHERE option_value LIKE '%<script%' OR option_value LIKE '%eval(%';

SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%<script%' AND post_status = 'publish';

SELECT user_login, user_email, user_registered
FROM wp_users ORDER BY user_registered DESC LIMIT 10;

Последний запрос находит подарочных администраторов. Свежий пользователь с почтой на несуществующем домене и правами админа означает, что доступ к админке у злоумышленника есть до сих пор, и чистка файлов вам не поможет.

Точка входа

Пока не понятно, как вошли, чистка это уборка перед следующим визитом. В логах доступа видно POST-запросы к скрипту, которого у вас нет, или обращения к уязвимому плагину за минуту до появления первого лишнего файла. Разбор по шагам с примерами строк лога я делал в материале про то, как найти точку взлома по логам. Если логи хостер хранит только неделю, а заражение старше, качайте их прямо сейчас, до того как ротация съест остаток.

Заявка на разблокировку: что приложить, чтобы не ходить по кругу

Типичное письмо клиента в поддержку выглядит так: «почистили, включайте». Через два часа приходит ответ: «при повторном сканировании обнаружено вредоносное ПО», и всё по новой. Каждая такая итерация стоит от часа до суток простоя.

Работает другое. Заявка, из которой видно, что человек понимает, что делал:

Тема: Заявка на разблокировку после чистки, аккаунт cr43080, сайт example.ru

Здравствуйте.
По вашему отчёту от 16.10.2026 провёл чистку. Что сделано:

1. Удалены (перенесены в карантин вне docroot) 14 файлов из вашего списка,
   полный перечень путей во вложении quarantine-list.txt
2. Ядро WordPress заменено на чистый дистрибутив 7.0 ru_RU,
   wp core verify-checksums проходит без ошибок
3. Все 18 плагинов переустановлены из официального каталога,
   плагин file-manager 6.9 (вектор заражения по логам) удалён
4. Удалён лишний администратор admin_sup (создан 09.10.2026),
   сброшены пароли всех пользователей и соли в wp-config.php
5. Сменены пароли: панель хостинга, FTP, пользователь БД
6. Права приведены к 644 для файлов и 755 для каталогов,
   php в uploads отсутствует (проверено find)

Прошу запустить повторное сканирование и снять блокировку.
Если сканер снова что-то найдёт, пришлите, пожалуйста, полные пути:
по первому отчёту два файла оказались ложным срабатыванием (см. ниже).

К письму прикладывайте список карантина и результат вашего собственного повторного сканирования. Хостеры обычно дают запустить проверку из панели, у Timeweb и Reg.ru это отдельный пункт в разделе безопасности.

Что не ускоряет разблокировку вообще: упоминание про уходящих клиентов, требование компенсации, просьба включить «хотя бы на час, я потом дочищу». Поддержка живёт по регламенту, и её регламент говорит: пока сканер видит детект, аккаунт закрыт.

Если это ложное срабатывание

Бывает, и чаще, чем хотелось бы. Классика: минифицированный slider.min.js с длинной base64-строкой внутри, вердикт HEUR.JS.Obfuscated. Или файл лицензионной проверки платной темы. Или .htaccess на 80 строк с правилами кэширования, который эвристика приняла за редиректор.

Спорить нужно предметно, одним сообщением:

  • полный путь к файлу и его размер;
  • откуда файл: плагин такой-то версии такой-то, скачан с wordpress.org;
  • совпадение контрольной суммы с дистрибутивом (вывод verify-checksums или md5sum обоих файлов);
  • прямая ссылка на этот же файл в исходниках плагина или темы;
  • просьба внести путь в исключения сканера по аккаунту.

Обычно хватает одной итерации, отвечает человек, а не робот. Ключевое слово тут «предметно»: на письмо «у меня нет вирусов, ваш сканер дурак» отвечают шаблоном.

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

Сколько это занимает по времени

ЭтапРеальный срок
Ответ поддержки на первую заявку1-4 часа в рабочее время
Временный доступ для лечения1-2 часа после запроса
Чистка визитки на WordPress, до 20 плагинов2-4 часа
Чистка магазина с кастомной темой и правками6-16 часов
Повторное сканирование хостеромот часа до суток
Снятие пометки в Яндексе и Google1-3 суток после запроса перепроверки

Последняя строка отдельная беда: сайт уже работает, а в выдаче на нём висит красная плашка. Что с этим делать, я расписывал в статье про сайт в чёрном списке Яндекса и Google. Запрос на перепроверку подаётся из Вебмастера и Search Console руками, сам он не подаётся.

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

После разблокировки: чек-лист на один вечер

Сайт открылся, и на этом обычно все успокаиваются. Зря: повторное заражение через тот же вектор я вижу в трети случаев, и происходит оно в первые две недели.

  • Сменить пароли: панель хостинга, FTP, пользователь БД, все админы WordPress, почта на домене (её часто угоняют вместе с сайтом).
  • Обновить соли в wp-config.php со страницы генератора api.wordpress.org, это разлогинит всех, включая чужие сессии.
  • Включить двухфакторку в админке и ограничить попытки входа.
  • Обновить ядро, плагины и PHP до актуальной ветки. Дырявый плагин, через который вошли, надо не обновить, а выкинуть, если он давно заброшен.
  • Проверить права: 644 на файлы, 755 на каталоги, 600 на wp-config.php. Никаких 777, даже временно.
  • Запретить исполнение php в uploads через правило веб-сервера.
  • Настроить бэкапы наружу, в S3 или на отдельный аккаунт. Копия в /wp-content/backups/ умирает вместе с сайтом.
  • Через 7 и через 30 дней пересканировать и посмотреть в логи. Спящая закладка часто просыпается не сразу.

Пункт про php в загрузках закрывается парой строк в конфиге:

# public_html/wp-content/uploads/.htaccess
<FilesMatch ".(php|phtml|php5|phar|sh|pl)$">
  Require all denied
</FilesMatch>

На nginx то же самое делается через location ~* /uploads/.*.php$ { deny all; } в конфиге сервера, на shared-хостинге об этом просят поддержку.

Сколько стоит и когда звать человека

Разовая чистка с разблокировкой у частного специалиста в 2026 году стоит порядка 8 000 — 15 000 рублей для визитки и 15 000 — 30 000 для магазина с правками в теме. Ночью и в выходные обычно с коэффициентом. Студии берут от 25 000 и часто продают вместе с этим годовую подписку на свой сканер.

Делать самому разумно, если у вас типовой WordPress без самописных модулей, есть SSH и не жалко вечера. Звать человека стоит, когда сайт приносит деньги каждый день, когда тема писалась под вас (сравнивать не с чем, и чистить придётся глазами), когда блокировка прилетела повторно или когда в отчёте фигурируют фишинговые страницы: там счёт идёт на часы, и одной чисткой дело не закончится.

Восстанавливать сайт с нуля вместо чистки почти никогда не выгодно. Даже простой корпоративный сайт заново обойдётся в районе 150 000 рублей и в месяц работы, тогда как чистка это один рабочий день. Я такие проекты не делаю принципиально: моя работа это обслуживание существующих сайтов, а не производство новых.

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

Частые вопросы

Что делать, если хостер заблокировал сайт за вирусы

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

Сколько времени занимает чистка

Простой сайт на типовой теме чистится за пару часов, сайт с кастомной темой и правками за 6-16 часов. Плюс время на ответ хостера по заявке на разблокировку.

Как ускорить разблокировку

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

Что делать, если антивирус ошибся

Написать в поддержку и назвать конкретные файлы. Ложные срабатывания ловят минифицированные скрипты и легальные плагины с обфускацией.

Передайте техническую часть в надёжные руки.

Слежу за хостингом, бэкапами и обновлениями. Когда что-то пойдёт не так – звоните мне, не своему программисту, не в спортзал и не маме.

Короткие вопросы по теме

Все вопросы по теме "Безопасность сайта"

Заявка

Обсудим задачу

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

Куда удобнее ответить?