Блог

Как проверить сайт на вирусы: советы профессионального админа

Как проверить сайт на вирусы
Вадим Корчинский
Лечит сайты с 2012

Я администрирую сайты с 2012 года. Специализируюсь на безопасности: удаляю вредоносные скрипты, устраняю уязвимости. Лечил как небольшие блоги, так и крупные интернет-магазины. Сегодня поделюсь инструментами, с помощью которых проверяю сайт на вирусы и удаляю их.

Эта статья не для новичков: понадобится знание основ HTML, PHP и JS, а также умение работать в консоли.

Что такое вирусы и как они попадают на сайт

Вирус — это вредоносный код. Он меняет внешний вид сайта, размещает рекламу, отправляет посетителей на другой сайт, даёт мошенникам доступ к сайту, использует ресурсы хостинга для майнинга или других вычислений.

На сайте вирус, если:

  1. На страницах появился контент, который владелец не добавлял.
  2. Сайт стал работать медленнее.
  3. При переходе на него пользователи видят другой ресурс.
  4. Упала посещаемость из поиска.
  5. На хостинге появились новые папки.

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

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

Убедиться в заражении

Если есть подозрение на вирус, но уверенности нет, надо убедиться в заражении. Для этого я проверяю сайт через онлайн-сканеры, а также в нескольких браузерах и поисковиках.

Проверка сайта на вирусы через онлайн-сканеры

Онлайн-сканеры помогают быстро найти вредоносный код, но я никогда не полагаюсь только на них: не все вирусы можно найти автоматически. Вот несколько сервисов:

Dr.Web иногда не находит вредоносные скрипты; это больше компьютерный сканер, чем сканер для анализа вирусов на сайте.

Поведение в разных браузерах и на разных устройствах

Один из признаков заражения — редирект. Это когда при переходе на ваш сайт пользователи видят другой ресурс. Заражённый сайт с компьютера может открываться нормально, а с телефона посетителей будет перекидывать на фишинговую страницу или страницу с мобильными подписками. Или наоборот.

Поэтому нужно проверять поведение сайта в разных браузерах, операционных системах и мобильных устройствах.

Вид в поиске

Поисковые системы автоматически проверяют сайты на вирусы. Заражённые ресурсы они помечают серым цветом и подписью с предупреждением.

Чтобы проверить свой сайт, введите адрес в поисковую строку Яндекса или Google. Если увидите предупреждение, значит, сайт заражён. Посмотрите вердикты и цепочки возможных заражений.

Способ не универсальный! Поисковые системы находят вредоносный код не сразу. Кроме того, вирус можно научить проверять источник запроса и прятаться от поисковиков. Если такой вирус увидит запрос из поисковой системы, скрипты не отработают — поисковая система не увидит подвоха.

Количество страниц в поисковой выдаче

Еще один вид вируса — дорвеи. Они встраивают на сайт свой контент.

Чтобы проверить сайт на дорвеи, снова используйте поиск. Введите запрос site:mysite.com и пересмотрите все результаты поиска. Если найдёте страницы, которые не соответствуют тематике вашего сайта, — это дорвеи.

Найти и удалить зловредов

Когда в заражении нет сомнений, вредоносный код надо найти и удалить. Основная проблема — найти. Я просматриваю файлы сайта вручную, а также использую консоль.

Проанализировать HTML и JS-скрипты

Вредоносные скрипты часто добавляют в исходный код сайта (в браузере нажите Сtrl+U). Проверьте его на наличие посторонних JS-скриптов, iframe-вставок и спам-ссылок. Если найдёте — удалите.

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

Все посторонние вставки удалите.

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

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

 

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

 

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

Ростислав Воробьёв, сотрудник техподдержки ISPsystem

Проверить дату изменения файлов и папок

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

Например, взлом произошел несколько дней назад, тогда для вывода всех PHP-скриптов, которые были изменены за последние 7 дней, нужно использовать команду: find . –name '*.ph*' –mtime -7

После выполнения команды нужно проанализировать найденные PHP-скрипты на возможные вредоносные вставки.

Это действительно помогает уменьшить список подозреваемых PHP-файлов, которые могут содержать зловредов. Однако не всегда зловреды в PHP-файлах. Немного модифицировав .htaccess файл, можно создать файл с разрешением .jpg, в нём разместить PHP-код и веб-сервер будет исполнять его как обычный PHP, но с виду это будет картинка — пример реализации.

Ростислав Воробьёв

Проанализировать директории upload/backup/log/image/tmp

Директории upload/backup/log/image/tmp потенциально опасны, так как обычно они открыты на запись. В большинстве случаев именно в них заливают shell-скрипты, через которые потом заражают файлы сайта и базу данных. Такие директории нужно проверять на возможные вредоносные PHP-скрипты.

Например, каталог upload можно проверить командой: find /upload/ -type f -name '*.ph*'

Она покажет все PHP-файлы в каталоге upload.

После анализа заражённые файлы можно удалить вручную или командой: find /upload/ -name '*.php*' -exec rm '{}' \;

Найти файлы и папки с нестандартными именами

Откройте каталог сайта. Найдите файлы и папки с нестандартными именами и подозрительным содержимым, удалите их.

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

Ростислав Воробьёв

Найти много PHP или HTML-файлов в одной директории

Все папки на хостинге нужно проверить на множественные php и html файлы в одной директории, сделать это можно командой:

find ./ -mindepth 2 -type f -name '*.php' | cut -d/ -f2 | sort | uniq -c | sort –nr

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

Найти вирусные скрипты по содержимому

Быстро проверить сайт на вирусные скрипты можно командой:

find ./ -type f -name "*.php" -exec grep -i -H "wso shell\|Backdoor\|Shell\|base64_decode\|str_rot13\|gzuncompress\|gzinflate\|strrev\|killall\|navigator.userAgent.match\|mysql_safe\|UdpFlood\|40,101,115,110,98,114,105,110\|msg=@gzinflate\|sql2_safe\|NlOThmMjgyODM0NjkyODdiYT\|6POkiojiO7iY3ns1rn8\|var vst = String.fromCharCode\|c999sh\|request12.php\|auth_pass\|shell_exec\|FilesMan\|passthru\|system\|passwd\|mkdir\|chmod\|mkdir\|md5=\|e2aa4e\|file_get_contents\|eval\|stripslashes\|fsockopen\|pfsockopen\|base64_files" {} \;

Либо можно использовать grep без find.

grep -R -i -H -E "wso shell|Backdoor|Shell|base64_decode|str_rot13|gzuncompress|gzinflate|strrev|killall|navigator.userAgent.match|mysql_safe|UdpFlood|40,101,115,110,98,114,105,110|msg=@gzinflate|sql2_safe|NlOThmMjgyODM0NjkyODdiYT|6POkiojiO7iY3ns1rn8|var vst = String.fromCharCode|c999sh|request12.php|auth_pass|shell_exec|FilesMan|passthru|system|passwd|mkdir|chmod|md5=|e2aa4e|file_get_contents|eval|stripslashes|fsockopen|pfsockopen|base64_files" ./

Эти команды выполнят поиск вредоносного кода в файлах текущего каталога. Они ищут файлы рекурсивно, от того каталога, в котором запущены.

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

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

Проверить базу данных

Часто во время взлома и заражения сайта вредоносный код добавляют в базу данных. Для быстрой проверки базы данных на вирусы нужно зайти в phpmyadmin и через поиск ввести по очереди запросы

<script , <? , <?php , <iframe

Если обнаружите вредоносный фрагмент, удалите его.

Да, верно. Но проанализировать содержимое базы данных рядовому пользователю будет непросто — понадобятся базовые навыки SQL, знание синтаксиса, а также понимание, в какой из таблиц нужно искать содержимое. Кроме того, зловред может быть в неявном виде, тоже каким-либо образом обфусцирован, закодирован и т. д.

Ростислав Воробьёв

Использовать онлайн-сервисы

Для автоматической проверки файлов сайта на вирусы, shell-скрипты, редиректы и дорвеи можно использовать сканеры:

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

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

Ростислав Воробьёв

Защитить сайт от взлома

После удаления всех shell-скриптов и вредоносных вставок сайт обязательно надо защитить от взлома. Тогда он станет неуязвим для атак извне.

Защита панели администратора сайта по IP

Злоумышленники попадают на сайт, взламывая панель администратора. Чтобы помешать им, установите ограничение на вход в панель по IP. Иными словами, разрешите входить в панель администратора только с определённого устройства.

Добавьте в каталог административной панели (administrator, bitrix/admin, wp-admin…) файл .htaccess с содержимым:

Order Deny, Allow Deny from all Allow from 1.1.1.1

Где 1.1.1.1 — IP-адрес, для которого разрешён доступ в админ панель.

Если IP-адрес не статический, можно добавить IP по зоне. Например, провайдер предоставляет IP-адрес вида 192.168.100.34. Тогда в .htaccess можно прописать allow from 192.168.

Защита панели администратора по HTTP-авторизации

Установите на админку сайта дополнительный логин и пароль. Для этого в каталог административной панели (administrator, bitrix/admin, wp-admin…) добавьте файлы .htaccess и .htpasswd .

В файле .htaccess нужно прописать такой код:

ErrorDocument 401 "Unauthorized Access"
ErrorDocument 403 "Forbidden"
AuthName "Authorized Only"
AuthType Basic
AuthUserFile /home/ site.com /admin/.htpasswd require valid-user

<Files ~ ".(css)$">
Allow from all
satisfy any
</Files>
<Files ~ ".(js)$">
Allow from all
satisfy any
</Files>
<Files ~ ".(png)$">
Allow from all
satisfy any
</Files>
<Files ~ ".(gif)$">
Allow from all
satisfy any
</Files>
<Files ~ ".(jpg)$">
Allow from all
satisfy any
</Files>

Где home/site.com/admin/.htpasswd — это полный путь к файлу .htpasswd вашего сервера.

 

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

Сгенерировать их можно на сайте Htpasswd Generator. Введите логин и пароль и нажмите Create .htpasswd file. Результат скопируйте в файл .htpasswd.

Защита каталогов сайта

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

Чтобы обезопасить сайт, нужно сделать hardening, то есть «забетонировать» сайт. Для этого нужно на все системные файлы CMS, плагинов и шаблонов, которые для бесперебойной работы не требуют разрешений на запись, установить права 444, для каталогов права нужно установить 555.

Я бы поставил 755 или 655 на системные файлы CMS, плагинов и шаблонов. А для каталогов — 644. Лучшим решением будет обратиться к документации конкретной CMS или плагина, чтобы узнать рекомендуемые права для его работы. Неправильные права могут сломать работу сайта.

Ростислав Воробьёв

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

  1. На все файлы — права 444.
  2. На все папки — права 555.
  3. На файлы, которые должны быть доступны на запись, — 644.
  4. На каталоги, которые должны быть доступны на запись, — 755.

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

В любом случае, если потребуется обновить плагины и шаблон, права можно рекурсивно изменить на 644 и 755, все обновить и заново установить права 444 и 555.

Для комфорта обычных пользователей создаются два PHP-скрипта:
mysite.com/protect.php — изменяет все права на файлы и папки 444 и 555,
mysite.com/unprotected.php — ставит права 644 и 755.

Чтобы права на файлы и каталоги не смогли изменить программным путем, в файл php.ini нужно добавить директиву disable_functions =chmod

Для каталогов (backup/log/image…), которым нельзя установить права 555 и в которых нет скриптов, нужно добавить файл .htaccess с таким содержимым:

RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml

Этот код блокирует выполнение потенциально опасных скриптов. Это запретит PHP-коду выполняться из директории, где не должно быть исполняемых файлов.

Защитили сайт — подпишитесь на блог!

Если статья оказалась вам полезной, подписывайтесь на блог Vepp. Раз в две недели присылаем редакторские материалы и статьи от экспертов: по лучшей настройке WordPress, работе с аналитикой и с другими полезностями.

Почитайте вот:
Что такое бэкапы сайта и почему их никто не делает
SSL-сертификат для сайта: зачем нужен, какой выбрать, где взять
5 бесплатных шаблонов интернет-магазина на WordPress

Подписаться!

 

 

Вадим Корчинский
Лечит сайты с 2012