Skip to content

Архив категории: Защита

Поиск вирусов на сайте

 

Поиск вирусов на php-хостинге — это непростая задача. PHP является интерпретируемым кодом и определение «вирус» для него некорректно. Больше подходит определение «зловредный код». Ситуацию усложняет тот факт, что серверные антивирусные программы не всегда могут его выявить. Чаще всего, распознать зловредный код может только опытный программист. Пока у антивирусных программ не появился полноценный искусственный интеллект, задача по поиску «зловредных кодов» лежит на плечах программистов.

Как зловредный код попадает на сайт?

Как правило в этом виноваты уязвимости в CMS, но чаще виноваты уязвимости в плагинах и расширениях для CMS. Чаще всего под удар попадают распространённые системы управления контентом с открытым исходным кодом такие как Joomla или WordPress. Так как мне приходилось обслуживать большое количество сайтов (это 300+ и для меня это большое количество) я убедился что чаще всего взламывают сайты на Joomla. Это не камень в огород Joomla (я уважаю данную CMS), а скорее камень в огород вебмастеров, которые бездумно ставят расширения откуда попало.

Я считаю что главная уязвимость Joomla заключается в том что файлы доступны по прямому вызову. Да, файлы дистрибутива обеспечены некой примитивной защитой против прямого вызова в виде проверки существования константы установленной в индексном файле и этого вполне хватает, но вот разработчики расширений не часто придерживаются этого правила. Это создаёт благоприятную обстановку для комнатных хакеров, которые прогуливая уроки в школе внимательно изучают код часто-используемых расширений. Бывает это делается с помощью специальных инструментов которые пишут уже не школьники но профессиональные взломщики которые щедро делятся наработками на тематических форумах.

Для осуществления атаки конечно же не достаточно иметь незащищённый от прямого вызова файл. В таком файле также должны присутствовать уязвимости в виде незащищённых переменных, отсутствие проверки вводимых данных и так далее. Одним словом они ищут результаты некомпетентности разработчика. И тут стоит заметить что PHP это тот самый язык программирования, который позволяет создавать приложения уже на третий час его изучения. Стоит ли объяснять почему рынок в сфере php-софта просто переполнен дилетантами чуть более чем полностью? Я бы даже сказал что это давно приняло катастрофические масштабы, за что почему-то принято ругать PHP. Так вот программных решений написанных дилетантами на PHP, навскидку две трети. Так что поиск уязвимостей в php-скриптах известных решений давно стало излюбленным занятием вставших на тёмную сторону силы программистов.

Зачем взламывают и заражают сайты?

Клиенты, чьи сайты мне пришлось восстанавливать после «вирусной атаки» (взлома и установки шеллов, бекдоров и т.д.) часто спрашивают меня, а зачем это делают? А кому это надо? И возможно это и не очевидный ответ для них, но это деньги. Иногда это очень большие деньги. Очень большие и лёгкие деньги. В общем всё то, что постоянно соблазняет любого программиста обременённого интеллектом и опытом. Существуют целые биржи взломанных сайтов, их продают, покупают, перекупают, выставляют на аукционы и так далее. Чем выше у взломанного сайта посещаемость тем он дороже. Чем больше квоты у хостинга на процессорное время, дисковое пространство, трафик, тем взломанный сайт дороже. Чем дольше взломанный сайт остаётся взломанным, тем он дороже. Взломанным сайт считается после того, как в него установили шелл/бекдор/закладку в общем инструмент позволяющий редактировать файлы на хостинге жертвы. Если кто-то имеет возможность редактировать файлы на хостинге, он может всё, в том числе и управлять базой данных. Из личного опыта скажу, что если вы нашли закладку, это значит что скорее всего её делал крякер-неумеха или бот (да-да представляете, уже полно ботов которые шарятся в автоматическом режиме по всем этим вашим интернетам и ищут уязвимости, неустанно, 24/7, и найдя автоматически делают «закладку»). Настоящий профи сделает бекдор так, что его не найдёт никто! Так что для этого обычный поиск по регулярным выражениям не подойдёт, а просматривать 5000+ файлов вашей CMS вручную я думаю не самое простое занятие, да и эффектно вставленный код может не распознать даже хороший программист. Действительно, качественные шеллы-закладки очень сильно похожи на файл той CMS в которую они интегрированы. Даже файлы самой CMS могут быть изменены так, что сам файл не изменит своего размера в байтах, не изменит своей даты создания/изменения, будет по-прежнему содержать в начале файла всякие успокаивающие бдительность комментарии и прочие уловки.

Так зачем же это всё-таки надо? Кому нужны взломанные сайты? Отвечу так: Взломанные сайты, это довольно востребованный продукт на чёрном it-рынке (даркнете), применения им масса: Перенаправление трафика (редиректы ну другие ресурсы), организация ботнетов для ddos-атак (ddos-атаки могут стоить очень дорого, так что владельцы ботнетов неплохо зарабатывают), это вредоносные javascript заражающие компьютеры посетителей с любой целью, это сбор информации любого рода, это кластерные вычисления (от каждого заражённого сайта по n% процессорного времени, и если их достаточно много то можно производить серьёзные операции). Конечно всё что я тут описал, это только для примера, чтобы хотя бы дать направление вашим мыслям в понимании того, для чего взламывают сайты. В реалиях ситуация намного сложнее и масштабнее, и есть такие причины для взлома, что не в сказке сказать не в блоге написать…

Как узнать что сайт взломали?

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

Как защитить свой сайт от взлома?

Существует не так много способов защитить свой сайт. Конечно же, методы защиты больше всего зависят от защищаемой CMS, но также они зависят и от хостинга. Я не буду пиарить или антипиарить и называть конкретных имён, могу сказать только, что даже самые топовые хостеры могут быть очень дырявыми и шеллы будут засовывать даже на html-сайты (то есть сайты на которых вообще нет не одного исполняемого скрипта).

Первым делом конечно же нужно разобраться с правами на папки сайта (чтобы узнать какие папки с какими правами должны быть нужно набрать в поисковике: «%CMSNAME% права на папки»), и делать это имеет смысл только в том случае, если вам позволено править на хостинге файл php.ini (если на хостинге PHP работает в режиме CGI и позволяет использовать разные версии PHP, тогда автоматически создаётся папка с настройками PHP для выбранной версии где и лежит этот самый php.ini). Данный конфигурационный файл нам нужен только для одной дерективы disable_functions в которой нужно указать что мы запрещаем функцию chmod которая отвечает за смену прав на папки.

И так в файле php.ini должна быть строчка:

Если данной строчки у вас в конфиге не будет, смена прав на папки вашей CMS что мёртвому припарки, ибо эти самые права лихо сменят снаружи обратно на 777. В тоже время, CMS скорее всего будет ругаться на то что у вас эта функция запрещена, потому что она сама хочет иметь возможность изменять права, но эта сама возможность ей необходима крайне редко (в основном при обновлении или установке новых плагинов), по этому при обновлении самой CMS или установки или обновлении плагинов, данную строчку в php.ini придётся комментировать.

Далее нужно запретить интерпретацию php-скриптов сервером в папках, где это не нужно. Например в Joomla это папки cache, images, logs, tmp ибо они становятся в основном пристанищем шеллов и бекдоров. Сделать это очень просто, нужно в каждую из этих папок закинуть файл .htaccess с вот таким кодом:

Данный .htaccess запретит выполнение большинства известных исполняемых файлов для сервера apache по этому даже если туда что-нибудь и засунут, это работать не будет. Конечно каждый отдельный сайт, плюс ко всему имеет свои нюансы. Так например какое-нибудь расширение Joomla может иметь ресурсные папки в каталоге media и в отдельно взятых случаях не получится сменить права на папки, например при использовании старых версий JBzoo.

Не могу не вспомнить и не отметить свою любимую OctoberCMS на базе Laravel, организация защиты на которой безупречна на мой взгляд. Все запросы идут исключительно через точку входа index.php в корне. Для ресурсов в ней выделенны отдельные публичные папки (единственно доступные из вне), найти в OctoberCMS уязвимость в ядре, означает пойти против многотысячной армии фанатиков Laravel, и даже не смотря на то что плагины к ней пишут все кому не лень, они вынуждены делать это по стандартам диктуемым Laravel, а это значит что они как минимум будут следовать стандартам PSR и принципам SOLID. Каждый плагин в OctoberCMS имеет своё пространство имён и с базой данных работает через абстракцию ORM. Я могу долго рассказывать про все его преимущества OctoberCMS, но сделаю это в рамках другого моего проекта который я готовлю.

Как чистить сайт от вирусов?

Итак, мы выяснили кто виноват, но далее следует более важный вопрос: что делать?Расскажу вкратце как это делаю я. Если есть возможность восстановить чистый бэкап тут всё понятно. Но если на сайте длительное время проводили какие-то работы, которые очень не хотят делать заново, приходится действовать более основательно. Я скачиваю сайт целиком на локалку, записываю поверх него чистый дистрибутив той CMS на которой он был сделан, учитывая номер версии целиком. То есть если это Joomla 3.5.1 то я ищу именно этот дистрибутив и просто замещаю им файлы заражённой CMS. Это убивает шелы и бекдоры скрытые в файлах ядра системы. Далее я прогоняю файлы сайта несколькими антивирусами, чаще всего помогает Kaspersky Virus Removal Tool (мне правда приходится его запускать в виртуалке потому что у меня линукс, но это мелочи), но также стоить отметить Comodo antivirus, ибо он тоже находит. Но дальше следует печальная новость, эти антивирусы находят куски зловредного кода по довольно большому проценту вхождения, и часто просто не знают про новые угрозы отлавливая только «жирные» экземпляры, а также они удаляют заражённый файл целиком, что может неблагоприятно сказаться на работоспособности сайта, ведь зловредный код был дописан к нативному. По этому выполняется титаническая работа, каждый обнаруженный файл не удаляется, а открывается и чистится в ручную (а вот только так, бывает, и можно исправить положение). Конечно такой подход позволяет в 99% случаев восстановить работоспособность сайта, но отнимает уйму времени, по этому я разработал скрипт, который позволяет это время изрядно сократить. Я не долго думал как назвать этот инструмент и назвал его PHP Shell Killer, я по большей части делал его для себя, но потом решил поделится. Суть его работы довольно проста, он просто рекурсивно сканирует все файлы сайта и обнаруженные результаты показывает в каталогизированном виде по уровню «подозрительности». То есть с начала я сканирую касперским и комодо, затем я просматриваю каждый обнаруженный файл, нахожу в его зловредном коде некую особенность и пишу на эту особенность регулярное выражение, стараясь придать этому выражению большую гибкость. И так получилось что через какое-то время, регулярных выражений стало хватать для того чтобы находить основную массу угроз, и самое главное я сделал так, что каждый обнаруженный файл можно редактировать. Запускать его можно прямо на сервере, и несмотря на то что он защищён паролем, после его лучше удалить.

PHP Shell killer

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

P.S. А если вы реально хотите защитить ваши сайты, особенно если их много, выбирайте хостинг с GIT-ом, и тогда все шеллы, бекдоры и тому подобное не ускользнёт от ваших глаз. Можно будет удобненько просматривать различия в файлах, вычищая зловредный код. И да, используйте OctoberCMS.

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