Что умеет веб-шелл
Через веб-шелл можно делать на сервере почти всё, что может сам сайт:
- просматривать, загружать, изменять и удалять файлы;
- выполнять команды операционной системы;
- читать
wp-config.phpилиdbconn.phpи получать доступ к базе данных; - создавать администраторов, размещать спам-страницы и редиректы;
- рассылать спам и атаковать другие сайты с вашего сервера.
Внешне сайт при этом может работать как обычно: шелл ничего не выводит на страницах и ждёт команды.
Как веб-шелл попадает на сайт
- Уязвимость загрузки файлов в плагине, модуле или форме, которая не проверяет тип файла. Это самый частый путь.
- Украденный пароль от админки — через редактор тем и плагинов или установку «плагина» с шеллом внутри.
- Украденный доступ к FTP или панели хостинга.
- «Нулённые» темы и плагины, где шелл уже встроен.
- Соседний заражённый сайт на том же аккаунте хостинга.
Как выглядит веб-шелл
Самые простые шеллы занимают одну строку:
<?php @eval($_POST['x']); ?>
<?php system($_GET['cmd']); ?>
Но чаще код запутан, чтобы его не нашли поиском:
<?php $a = 'as'.'se'.'rt'; $a(str_rot13(base64_decode($_COOKIE['d']))); ?>
<?php $f = "\x63\x72\x65\x61\x74\x65_function"; ... ?>
Встречаются и полноценные «файловые менеджеры» на тысячи строк с паролем и интерфейсом — их легко узнать по характерному виду, если открыть файл в браузере.
Где искать
- Папки загрузок:
wp-content/uploadsв WordPress,/upload/в Битриксе,image/в OpenCart. PHP-файлов там быть не должно вообще. - Файлы с двойным расширением:
photo.php.jpg,image.jpg.php,.phtml,.php5,.phar. - Файлы с правдоподобными именами:
wp-cache.php,class-wp-*.phpне на своём месте,about.php,index-old.php,.config.php. - Вставки в существующие файлы: одна строка в начале
index.php,functions.phpили файла плагина. - Скрытые файлы и папки, начинающиеся с точки.
Полезные команды для поиска по SSH:
# PHP-файлы в папке загрузок
find . -path "*upload*" -type f \( -name "*.php*" -o -name "*.phtml" -o -name "*.phar" \)
# Файлы с подозрительными функциями
grep -rlE "(eval|assert|system|shell_exec|passthru)\s*\(\s*\\\$_(POST|GET|REQUEST|COOKIE)" --include=*.php .
# PHP-код внутри «картинок»
grep -rl "<?php" --include=*.jpg --include=*.png --include=*.gif --include=*.ico .
Подробнее о разборе найденного кода — в статье «eval(base64_decode) в коде сайта».
Как удалить веб-шелл правильно
- Сделайте копию найденных файлов для анализа и копию всего сайта.
- Удалите шеллы. Если шелл вставлен в легальный файл, замените файл оригинальной версией из дистрибутива.
- Посмотрите, что шелл успел сделать: новые файлы с той же датой, новые пользователи, изменения в базе, задания cron.
- Найдите в журнале доступа обращения к шеллу — по ним видно IP злоумышленника и, главное, как шелл был загружен.
- Закройте уязвимость и смените все пароли: админки, хостинга, FTP, базы данных.
Как защититься
Самая эффективная мера — запретить выполнение PHP в папках загрузок. Даже если файл загрузят, сервер не будет его выполнять. Готовые правила для Apache и nginx — в чек-листе защиты WordPress.
Вторая мера — контроль новых файлов. FYZI Shield каждый день сравнивает файлы сайта с предыдущим состоянием и сообщает в Telegram о любом новом PHP-файле, а подозрительные сразу отправляет в карантин.
Частые вопросы
Антивирус хостинга не нашёл веб-шелл. Значит, его нет?
Не обязательно. Антивирусы хорошо находят известные шеллы, но новые или специально запутанные варианты часто пропускают. Ручной поиск по признакам и контроль новых файлов надёжнее.
Я удалил шелл, но через день он появился снова. Почему?
Скорее всего, на сайте остался второй шелл, задание cron или вредоносный код в базе, который восстанавливает файл. Либо уязвимость, через которую его загрузили, не закрыта.
Можете найти и удалить шеллы за нас?
Да, это часть срочной чистки — от 4 990 ₽. Находим все шеллы и бэкдоры, точку входа и закрываем её.