
Как найти веб-шелл на сайте: пошаговая проверка и очистка
Веб-шелл ищут по свежим файлам, подозрительным функциям (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 и админ-панели, а также взломанные соседние сайты на одном хостинговом аккаунте. Поэтому поиск шелла — это всегда ещё и расследование: нужно понять вектор атаки.
Отдельная сложность в том, что хороший шелл ничем себя не выдаёт. Сайт открывается, заказы приходят, а вредоносный код живёт месяцами. Узнают о нём обычно по косвенным симптомам.
Новые PHP-файлы
Скрипты в uploads, cache, tmp, images — там, где PHP быть не должно.
Странные даты изменений
Десятки файлов с одинаковым временем правки, которого вы не помните.
Предупреждения поисковиков
Уведомления в Яндекс Вебмастере и Google Search Console о вредоносном ПО.
Скачки нагрузки
Рост CPU и исходящего трафика без роста посещаемости в Метрике и Analytics.
Чужие редиректы
Мобильные пользователи или трафик из поиска уходят на сторонние сайты.
Письма в спаме
Хостинг блокирует исходящую почту или сообщает о массовой рассылке.
С чего начать поиск
Если совпал хотя бы один признак, не торопитесь «чистить» всё подряд. Сначала сделайте полную копию сайта и базы данных в изолированное место: она понадобится для анализа и как страховка, если что-то пойдёт не так. Затем по возможности переведите сайт в режим обслуживания или ограничьте доступ к админке по IP.
Искать веб-шелл логичнее всего в тех местах, куда злоумышленнику проще всего записать файл и где он меньше всего бросается в глаза.
Где чаще всего прячутся веб-шеллы
- 01
Папки загрузок: wp-content/uploads, upload, images, files — PHP там быть не должно вообще
- 02
Каталоги кеша и временных файлов: cache, tmp, temp, logs
- 03
Папки плагинов и тем, особенно неиспользуемых или «взломанных» нулл-версий
- 04
Файлы с невинными именами: wp-config-sample.php, class.php, favicon.php, .index.php, а также имена, похожие на системные
- 05
Скрытые каталоги, начинающиеся с точки, и вложенность из пяти-шести уровней
- 06
Подменённые системные файлы: index.php, .htaccess, functions.php, wp-load.php, header.php
- 07
Файлы с двойным расширением вроде image.jpg.php или shell.php.jpg, которые сервер всё равно исполняет
Пошаговая ручная проверка сайта
- 01
Сделайте резервную копию файлов и базы данных до любых правок. Сохраните также логи веб-сервера: они пригодятся для расследования.
- 02
Найдите недавно изменённые файлы. Команда find . -name '*.php' -mtime -7 покажет PHP-файлы, менявшиеся за последнюю неделю. Сопоставьте даты с вашими обновлениями и правками.
- 03
Проверьте PHP в папках загрузок. Команда find wp-content/uploads -name '*.php' в чистом WordPress обычно ничего не возвращает. Любой найденный файл — повод для детального изучения.
- 04
Сверьте ядро CMS с оригиналом. Для WordPress используйте wp core verify-checksums из WP-CLI, для других CMS сравните каталог с чистым дистрибутивом той же версии через diff или Git.
- 05
Поищите опасные функции в коде (команды приведены ниже) и внимательно изучите каждое совпадение: легитимные плагины тоже иногда используют base64, но не в таком виде.
- 06
Проверьте .htaccess, php.ini и .user.ini. Директивы auto_prepend_file и auto_append_file подключают вредоносный код к каждому запросу, а подозрительные правила RewriteRule отвечают за редиректы.
- 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()Дополнительные слои обфускации, часто идут цепочкой с base64system() / 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 и ключи базы
Как правильно
- 01
Ищите все бэкдоры по содержимому и по дате изменения, а не по названию
- 02
Сверяйте ядро CMS, плагины и темы с чистыми версиями
- 03
Сначала обновите уязвимый компонент, затем восстанавливайте файлы
- 04
Смените все пароли, ключи API и соли в конфигурации, завершите чужие сессии
Как закрыть дыру после очистки
После того как все найденные шеллы удалены, переходите к профилактике. Обновите CMS, плагины и темы, удалите неиспользуемые расширения, особенно «взломанные» премиум-версии. Запретите исполнение PHP в папках загрузок на уровне настроек веб-сервера и ограничьте права на запись: файлы ядра не должны быть доступны для изменения процессу сайта.
Включите двухфакторную аутентификацию для админки и хостинга, ограничьте доступ к панели по IP и регулярно проверяйте список пользователей. Настройте автоматические резервные копии с хранением вне сервера и ежедневное сканирование. А через неделю-две повторите проверку: если бэкдор остался, он обычно проявляется именно в этот период.
Изолировать
Режим обслуживания, ограничение доступа, полная копия файлов, базы и логов.
Найти
Свежие файлы, сигнатуры в коде, сверка с чистой CMS, анализ логов.
Удалить и закрыть
Убрать все бэкдоры, обновить уязвимые компоненты, сменить все пароли и ключи.
Проверить повторно
Сканер, Яндекс Вебмастер и Google Search Console, затем запрос на перепроверку.
Итоги: как действовать, если подозреваете веб-шелл
- 01
Сделайте копию сайта, базы и логов перед любыми правками
- 02
Проверьте папки загрузок, кеша и свежие PHP-файлы
- 03
Найдите опасные связки eval, base64_decode, system с данными из запроса
- 04
Изучите логи и разделы безопасности Яндекс Вебмастера и Google Search Console
- 05
Удалите все бэкдоры, закройте уязвимость и смените пароли и ключи
- 06
Настройте регулярное сканирование и перепроверьте сайт через 1–2 недели
Чем раньше обнаружен шелл, тем меньше ущерб для данных, репутации и позиций в Яндексе и Google. Если не уверены в своих силах или сайт критичен для бизнеса, лучше привлечь специалиста: он проведёт аудит, найдёт скрытые бэкдоры и поможет вывести сайт из-под фильтров поисковиков.
Часто задаваемые вопросы
Это небольшой скрипт (чаще на PHP), который злоумышленник размещает на сервере. Он открывает удалённый доступ: можно загружать и менять файлы, запускать команды, читать базу данных и рассылать спам от имени вашего сайта.
Проверьте раздел безопасности в Яндекс Вебмастере и Google Search Console, запустите сканер хостинга (например, ImunifyAV или встроенный антивирус панели) и просмотрите через файловый менеджер, нет ли PHP-файлов в папках загрузок и недавно изменённых файлов.
Нет. Обычно злоумышленник оставляет несколько бэкдоров и уже знает уязвимость, через которую зашёл. Нужно найти все копии, закрыть дыру, сменить все пароли и ключи и проверить сайт повторно через несколько дней.
Автоматическое сканирование стоит включить на ежедневный или еженедельный запуск, а ручную сверку файлов с чистым дистрибутивом CMS делать после каждого обновления и при любых подозрительных признаках.
Да. Поисковые системы могут пометить сайт как опасный, понизить его в выдаче или показать предупреждение пользователям. Часто на сайт также внедряют скрытые ссылки и дорвей-страницы, которые портят репутацию домена.
Подозреваете взлом? Проверим сайт на веб-шеллы и вредоносный код
Найдём бэкдоры, закроем уязвимость и вернём сайт в чистый поисковый индекс
Спасибо за заявку!
Мы свяжемся с вами в ближайшее время.
Проверили сотни сайтов на WordPress и Bitrix



