Как найти веб-шелл на сайте: пошаговая проверка и очистка
Лоток с ячейками, в которых ровными рядами лежат одинаковые белые карточки, одна из них изумрудная

Как найти веб-шелл на сайте: пошаговая проверка и очистка

Веб-шелл ищут по свежим файлам, подозрительным функциям (eval, base64_decode) и логам. Разбираем команды, сканеры и порядок очистки сайта.

Как найти веб-шелл на сайте

Веб-шелл находят тремя способами: сверкой файлов с чистым дистрибутивом CMS, поиском опасных функций (eval, base64_decode, system) по коду и анализом логов на странные POST-запросы к PHP-файлам.

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

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

Что такое веб-шелл и как он попадает на сайт

Веб-шелл (web shell) — это файл или фрагмент кода на языке, который исполняет ваш веб-сервер: чаще всего PHP, реже ASP.NET, JSP или Python. Самые известные семейства — c99, r57, WSO, b374k, China Chopper. Но в реальных взломах чаще встречаются не «громоздкие» панели, а крошечные однострочные загрузчики, которые принимают команду из запроса и выполняют её.

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

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

признаки заражения
01

Новые PHP-файлы

Скрипты в uploads, cache, tmp, images — там, где PHP быть не должно.

02

Странные даты изменений

Десятки файлов с одинаковым временем правки, которого вы не помните.

03

Предупреждения поисковиков

Уведомления в Яндекс Вебмастере и Google Search Console о вредоносном ПО.

04

Скачки нагрузки

Рост CPU и исходящего трафика без роста посещаемости в Метрике и Analytics.

05

Чужие редиректы

Мобильные пользователи или трафик из поиска уходят на сторонние сайты.

06

Письма в спаме

Хостинг блокирует исходящую почту или сообщает о массовой рассылке.

С чего начать поиск

Если совпал хотя бы один признак, не торопитесь «чистить» всё подряд. Сначала сделайте полную копию сайта и базы данных в изолированное место: она понадобится для анализа и как страховка, если что-то пойдёт не так. Затем по возможности переведите сайт в режим обслуживания или ограничьте доступ к админке по IP.

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

Где чаще всего прячутся веб-шеллы

  1. 01

    Папки загрузок: wp-content/uploads, upload, images, files — PHP там быть не должно вообще

  2. 02

    Каталоги кеша и временных файлов: cache, tmp, temp, logs

  3. 03

    Папки плагинов и тем, особенно неиспользуемых или «взломанных» нулл-версий

  4. 04

    Файлы с невинными именами: wp-config-sample.php, class.php, favicon.php, .index.php, а также имена, похожие на системные

  5. 05

    Скрытые каталоги, начинающиеся с точки, и вложенность из пяти-шести уровней

  6. 06

    Подменённые системные файлы: index.php, .htaccess, functions.php, wp-load.php, header.php

  7. 07

    Файлы с двойным расширением вроде image.jpg.php или shell.php.jpg, которые сервер всё равно исполняет

Пошаговая ручная проверка сайта

  1. 01

    Сделайте резервную копию файлов и базы данных до любых правок. Сохраните также логи веб-сервера: они пригодятся для расследования.

  2. 02

    Найдите недавно изменённые файлы. Команда find . -name '*.php' -mtime -7 покажет PHP-файлы, менявшиеся за последнюю неделю. Сопоставьте даты с вашими обновлениями и правками.

  3. 03

    Проверьте PHP в папках загрузок. Команда find wp-content/uploads -name '*.php' в чистом WordPress обычно ничего не возвращает. Любой найденный файл — повод для детального изучения.

  4. 04

    Сверьте ядро CMS с оригиналом. Для WordPress используйте wp core verify-checksums из WP-CLI, для других CMS сравните каталог с чистым дистрибутивом той же версии через diff или Git.

  5. 05

    Поищите опасные функции в коде (команды приведены ниже) и внимательно изучите каждое совпадение: легитимные плагины тоже иногда используют base64, но не в таком виде.

  6. 06

    Проверьте .htaccess, php.ini и .user.ini. Директивы auto_prepend_file и auto_append_file подключают вредоносный код к каждому запросу, а подозрительные правила RewriteRule отвечают за редиректы.

  7. 07

    Осмотрите базу данных, пользователей и задания cron. Новые администраторы, вставки с iframe и script в записях, чужие задачи в crontab — частые следы взлома.

Поиск подозрительного кода командами

Если у вас есть SSH-доступ, самый быстрый способ найти подозрительные места — поиск по шаблонам. Например, команда `grep -rEn '(eval|base64_decode|gzinflate|str_rot13)[[:space:]]*[(]' --include='*.php' .` выводит все файлы и строки, где встречаются типичные функции маскировки. Для запуска системных команд подойдёт такой же поиск по `system`, `shell_exec`, `passthru`, `exec`, `popen` и `proc_open`.

Учтывайте, что результатов будет много: в нормальных плагинах эти функции встречаются тоже. Ищите комбинации: eval вместе с base64_decode и данными из $_POST, $_GET, $_REQUEST или $_COOKIE. Подозрительны и очень длинные строки без пробелов, и код, где имена функций собираются из кусочков или через chr().

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

сигнатуры в коде
eval()Выполняет строку как PHP-код — основа большинства однострочных шеллов
base64_decode()Раскодирует спрятанную полезную нагрузку, чтобы обойти простой поиск
gzinflate() / str_rot13()Дополнительные слои обфускации, часто идут цепочкой с base64
system() / shell_exec()Запуск команд операционной системы с правами веб-сервера
$_POST / $_REQUESTИсточник команды: шелл получает её из запроса злоумышленника
file_put_contents()Запись на диск новых файлов — так шелл размножается
Опасна не одна функция, а связка «данные из запроса → декодирование → выполнение».

Логи сервера и инструменты поисковиков

Логи доступа (access.log) часто выдают шелл быстрее, чем анализ кода. Ищите POST-запросы к PHP-файлам, которые обычно получают только GET: например, к файлам в uploads или к редким скриптам в корне. Подозрительны также запросы с длинными закодированными параметрами и многократные обращения к одному неизвестному файлу с разных IP-адресов.

Подсказки даёт и внешняя диагностика. В Яндекс Вебмастере загляните в раздел «Безопасность и нарушения», а в Google Search Console — в «Проблемы безопасности» и «Меры, принятые вручную». Резкий рост страниц в индексе, незнакомые URL с китайскими или фармацевтическими запросами, а также всплески трафика в Яндекс Метрике и Google Analytics по неизвестным разделам — признак того, что на сайт внедрили дорвеи через шелл.

ИнструментЧто делаетОграничение
ImunifyAV / Imunify360Сканирует аккаунт на хостинге по базе сигнатурНе заменяет ручной анализ обфусцированных шеллов
AI-Bolit (Revisium)Ищет вредоносный код и подозрительные изменения в файлах сайтаНужен доступ к файлам, результат требует интерпретации
Linux Malware Detect + ClamAVПроверяет файлы на сервере с регулярным обновлением сигнатурТребует настройки и доступа к серверу
Wordfence / аналоги для CMSСравнивает файлы и ищет известные угрозы внутри CMSРаботает только в среде самой CMS, которую уже могли скомпрометировать
WP-CLI verify-checksumsСверяет файлы ядра WordPress с официальными контрольными суммамиНе проверяет плагины, темы и загруженные файлы

Нашли шелл — не удаляйте его сразу

Находка — это момент, когда легко наделать ошибок. Сначала сохраните копию файла и зафиксируйте путь, дату изменения и владельца. Затем посмотрите в логах, с какого IP-адреса и когда к нему обращались: первое обращение подскажет время взлома, а запросы незадолго до него — путь проникновения.

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

Частые ошибки при поиске и удалении веб-шелла

Из-за этих промахов сайт взламывают повторно уже через несколько дней.

Как делают неправильно

  • Удаляют один найденный файл и считают проблему решённой
  • Ищут только по именам вроде shell.php или c99.php
  • Восстанавливают сайт из бэкапа, не закрыв уязвимость
  • Меняют только пароль админки, оставляя FTP, SSH и ключи базы

Как правильно

  1. 01

    Ищите все бэкдоры по содержимому и по дате изменения, а не по названию

  2. 02

    Сверяйте ядро CMS, плагины и темы с чистыми версиями

  3. 03

    Сначала обновите уязвимый компонент, затем восстанавливайте файлы

  4. 04

    Смените все пароли, ключи API и соли в конфигурации, завершите чужие сессии

Как закрыть дыру после очистки

После того как все найденные шеллы удалены, переходите к профилактике. Обновите CMS, плагины и темы, удалите неиспользуемые расширения, особенно «взломанные» премиум-версии. Запретите исполнение PHP в папках загрузок на уровне настроек веб-сервера и ограничьте права на запись: файлы ядра не должны быть доступны для изменения процессу сайта.

Включите двухфакторную аутентификацию для админки и хостинга, ограничьте доступ к панели по IP и регулярно проверяйте список пользователей. Настройте автоматические резервные копии с хранением вне сервера и ежедневное сканирование. А через неделю-две повторите проверку: если бэкдор остался, он обычно проявляется именно в этот период.

порядок очистки
01

Изолировать

Режим обслуживания, ограничение доступа, полная копия файлов, базы и логов.

02

Найти

Свежие файлы, сигнатуры в коде, сверка с чистой CMS, анализ логов.

03

Удалить и закрыть

Убрать все бэкдоры, обновить уязвимые компоненты, сменить все пароли и ключи.

04

Проверить повторно

Сканер, Яндекс Вебмастер и Google Search Console, затем запрос на перепроверку.

Если сайт принимает платежи или хранит персональные данные клиентов, после обнаружения веб-шелла проверьте, не утекла ли база. В зависимости от ситуации может потребоваться уведомить пользователей и сменить ключи платёжных систем.

Итоги: как действовать, если подозреваете веб-шелл

Надёжный результат даёт связка: поиск по дате и содержимому, сверка с чистой CMS, анализ логов и закрытие уязвимости, а не удаление одного файла.
  1. 01

    Сделайте копию сайта, базы и логов перед любыми правками

  2. 02

    Проверьте папки загрузок, кеша и свежие PHP-файлы

  3. 03

    Найдите опасные связки eval, base64_decode, system с данными из запроса

  4. 04

    Изучите логи и разделы безопасности Яндекс Вебмастера и Google Search Console

  5. 05

    Удалите все бэкдоры, закройте уязвимость и смените пароли и ключи

  6. 06

    Настройте регулярное сканирование и перепроверьте сайт через 1–2 недели

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

Часто задаваемые вопросы

Подозреваете взлом? Проверим сайт на веб-шеллы и вредоносный код

Найдём бэкдоры, закроем уязвимость и вернём сайт в чистый поисковый индекс

Бесплатный первичный аудитОтчёт за 24 часаОчистка с гарантией

Проверили сотни сайтов на WordPress и Bitrix

Политика конфиденциальности

При оставлении заявки на ресурсе «https://gurucontext.ru» пользователи предоставляют следующие сведения:

  • Имя
  • Контактный телефон или Telegram
  • Адрес сайта пользователя (не обязательно)

Также администрация сайта получает данные об IP-адресе посетителей, типе браузера, времени нахождения на сайте и прочие подобные сведения через сервисы статистики.

Использование информации

Вся полученная информация используется администрацией «https://gurucontext.ru» исключительно в целях связи с клиентом.

Защита персональных данных

Компания «https://gurucontext.ru» обязуется не разглашать сведения, полученные от пользователей, и хранит их в защищённом виде.

Предоставление данных третьим лицам

Полученные сведения не передаются третьим лицам, за исключением случаев исполнения обязательств перед клиентом (с его разрешения) и обоснованных требований закона.

Контакты

Телефон: +7 (499) 955-47-00.
E-mail: info@gurucontext.ru.