Антивирус на коленке или вирусы на сайте

06.05.2014  00:29

Итак, штатная ситуация — на сайте завелись вирусы. Если Яндекс и Гугл это ещё не заметили — ваше счастье.

Перво-наперво — посмотрите какие файлы менялись последними. Типовой пример: яваскриптовая зараза, как правило ради сливания траффика.

Если вы обнаружили в коде конструкции вида:
document.write('')
/*
внутри какое-то говно непонятного назначения, но не счётчик и не ваш код
*/


или


то большой повод задуматься. JavaScript`ы как правило заражают самый конец файла, очень редко после открывающимся body. Визуально заметно, что какая-то километровая строка непонятного назначения. Кроме того, что вытянуто в одну строку без переносов, часто попадается eval или декодирование какого-нибудь хэша.

Если инфицирована пара файлов — можно поприбивать руками. Если счёт идёт на сотни и тысячи, то проблему надо решать как-то пакетно. И тут пара вариантов:
  • выкачивать сайт и менять каким-нибудь редактором типа Dreamweaver, NetBeans или Notepad++ (любым, умеющим искать и заменять по множеству файлов)
  • или использовать специально-натасканный скрипт


Я выбрал второй вариант, выкачивать целиком сайт оказалось слишком долго.

Итак, от скрипта нам надо 2 вещи:
  • чтобы рекурсивно перелопачивал директории
  • и чтобы искал по регулярному выражению


Итоговый скрипт удаления вирусов на сайте:
 ////////////////////////////////////////////////////////// 
  // Рекурсивная функция - спускаемся вниз по каталогу 
  ////////////////////////////////////////////////////////// 
  function scan_dir($dirname) 
  { 
    // Объявляем переменные замены глобальными 
    GLOBAL $text, $retext; 
    // Открываем текущую директорию 
    $dir = opendir($dirname); 
    // Читаем в цикле директорию 
    while (($file = readdir($dir)) !== false) 
    { 
      // Если файл обрабатываем его содержимое 
      if($file != "." && $file != "..") 
      { 
        // Если имеем дело с файлом - производим в нём замену 
		if (preg_match("/(.php)$/is",$file)) {
		//искать в php файлах. Меняйте на js или html по надобности; или другие форматы
        if(is_file($dirname."/".$file)) 
        { 
          // Читаем содержимое файла 
          $content = file_get_contents($dirname."/".$file); 
          // Осуществляем замену 
		  //if (preg_match ('#(function g(){var r=new RegExp)(.*?)#is', $content )) {
		  /*
		  эта закомментированная строка ищет строку, начинающюся на 
		  */
		  if (preg_match ('#document.write('(function g(){var r=new RegExp)(.*?)#is', '', $content);
          //$content = str_replace($text, $retext, $content); 
		  /*
		  можно и по-простому str_replace`ом вместо вышестоящего preg_replace. 
		  в конце файла надо раскомментировать 2 строки
		  */
          // Перезаписываем файл 
			file_put_contents($dirname."/".$file,$content); 
		  echo $dirname."/".$file."---
";//exit; /* этот exit чтобы останавливать после первого нахождения и проверять где что нашёл. Желательно закомментировать строку выше file_put_contents(...), чтобы файл не перезаписался, пока вы тестируете скрипт. */ } } } // Если перед нами директория, вызываем рекурсивно // функцию scan_dir if(is_dir($dirname."/".$file)) { //echo $dirname."/".$file."
"; scan_dir($dirname."/".$file); } } } // Закрываем директорию closedir($dir); } //$text = '$text'; // Искомая строка //$retext = '$retext'; // Строка замены //вдруг понадобится :) выше закомментирован str_replace по этому поводу $dirname = $_SERVER["DOCUMENT_ROOT"];//""; scan_dir($dirname); // Вызов рекурсивной функции

Можете скачать этот файл, если код некорректно отображается.

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

Не забудьте сделать резервную копию :) А то мало ли что.

Ну и если поисковики уже прочухали, что сайт заражён и повесили угрожающую приписку в выдаче, то надо быстро добавить сайт в панели вебмастера на Яндексе и Гугле и катать заявку, что посыпаете голову пеплом и больше такого не повторится.
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



перейти в Блог | Блог (стр. 13)

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): PHP 58  web-программирование 82  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)