ФорумПрограммированиеПыхнуть хотите?Готовые решения → Лечилка вирусных-iframe на сайтах

Лечилка вирусных-iframe на сайтах

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 16 июля 2009 г. 13:47

    Стало модным порастать вирусами, которые вшивают iframe в сайты при редактировании сайта через FTP.
    Меня попросили написать простенькую лечилку…


    <?php

    class iframeScanner
    {
       /**
        * Необходимо передать путь до директории с которой надо начинать лечить
        * @param $directory
        */
       public function __construct($directory)
       {
           $this->directory = $directory;
       }
       
       /**
        * Сканирование.
        * Просто собирается со всех страниц информация о содержащихся в них iframe
        * @return array список файлов с iframe и сам iframe
        */
       public function scan ()
       {
           
           $this->directoryLength = strlen($this->directory);
           
           $fileSPLObjects = new RecursiveIteratorIterator(
               new RecursiveDirectoryIterator($this->directory),
               RecursiveIteratorIterator::CHILD_FIRST
           );
           
           foreach($fileSPLObjects as $fullFileName => $fileSPLObject) {
               
               if(preg_match('~\.'.$this->ignoreExts.'~', $fullFileName) or $fileSPLObject->isDir()) {
                   continue;
               }

               $this->fullFilesCount++;
               
               $this->fileContent = file_get_contents($fullFileName);
               $position = strpos($this->fileContent, '<iframe');
               
               if($position !== false) {
                   
                   $pf = preg_match_all('~<iframe src=\"(.*?)\".*?</iframe>~s', $this->fileContent, $matches);
                   
                   if(!$pf) {
                       continue;
                   }
                   
                   $shortFileName = substr($fullFileName, $this->directoryLength);
                   $this->infectionFilesCount++;
                   
                   $this->resultList[] = array(
                       'full_path' => $fullFileName,
                       'short_path' => $shortFileName,
                       'iframe' => $matches[0],  
                       'src' => $matches[1]
                   );
                   
               }
               
           }
           
           return $this->resultList;
       }
       
       /**
        * Лечилка.
        * Те iframe которые были найдены с помощью scan() будут удалены
        * @return int выводит кол-во удаленных iframe
        */
       public function cure () {
           
           $count = 0;
           
           foreach($this->resultList as $file) {
               
               $fileContent = file_get_contents($file['full_path']);
               $fileContent = str_replace($file['iframe'], '', $fileContent);
               file_put_contents($file['full_path'], $fileContent);
               $count++;
           }
           
           return $count;
       }
       
       public
           $directory = '',
           $directoryLength = 0,
           $ignoreExts = '(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)',
           $fullFilesCount = 0,
           $infectionFilesCount = 0,
           $fileContent = '',
           $resultList = array();
    }

    ?>



    Сканирование на наличие iframe:


    <?php

    $scan = new iframeScanner(realpath(dirname(__FILE__).'/..'));
    $scanFiles = $scan->scan();

    echo '<table width="100%">';
    foreach($scanFiles as $k => $iframe) {
       
       echo '<tr><td>'.++$k.'</td>';
       echo '<td>'.$iframe['short_path'].'</td>';
       
       echo '<td><ol>';
       foreach($iframe['src'] as $src) {
           echo '<li>'.$src.'</li>';
       }
       echo '</ol></td></tr>';
       
    }
    echo '</table>';

    if($scan->infectionFilesCount == 0) {
       echo '<div>Зараженных файлов не найдено!</div>';
    }

    echo '
       <div>
         Просканировано: '.$scan->fullFilesCount.'<br />
         Зараженных: '.$scan->infectionFilesCount.'
       </div>';

    if($scan->infectionFilesCount != 0) {
       echo '<h2><a href="?cure">Вылечить!</a></h2>';
    }
    ?>


    Лечение и вывод результатов лечения:


    <?php

    $scan = new iframeScanner(realpath(dirname(__FILE__).'/..'));
    $scanFiles = $scan->scan();

       $cure = $scan->cure();
       if($cure) {    
           echo '<div>Вылечил! ('.$cure.')</div>';
       } else {
           echo '<div>Лечить нечего… :(</div>';
       }
    ?>


    При необходимости можете расширить функционал, написав дополнительные проверки в scan().
    adw/0
  • rider-sx

    Сообщения: 2706 Репутация: N Группа: Адекваты

    Spritz 16 июля 2009 г. 13:52, спустя 5 минут 31 секунду

    Спасибо =) Пригодится…
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 16 июля 2009 г. 14:27, спустя 34 минуты 57 секунд

    ваще круто но насколько я помню

    $ignoreExts = '(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)',


    .htaccess не видно в списке файлов так же как и директорию .svn потому что они скрытые

    PS 3434
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 16 июля 2009 г. 14:30, спустя 2 минуты 47 секунд

    CTAPbIu_MABP, видно
    adw/0
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 16 июля 2009 г. 14:32, спустя 2 минуты 7 секунд

    буду знать
  • Dr.TRO

    Сообщения: 254 Репутация: N Группа: Адекваты

    Spritz 10 сентября 2009 г. 17:36, спустя 56 дней 3 часа 3 минуты

    Ужс, нафига класс целый писать ? Регулярка очень уныла, удержусь от коментов
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 сентября 2009 г. 17:48, спустя 12 минут 30 секунд


    Ужс, нафига класс целый писать ? Регулярка очень уныла, удержусь от коментов

    1. мне было удобно использовать класс и SPL
    2. главное что регулярка справляется с задачей, я не фанат выебываться крутым кодом
    3. Если удерживаетесь от комментариев, то не надо было его писать.
    adw/0
  • Dr.TRO

    Сообщения: 254 Репутация: N Группа: Адекваты

    Spritz 10 сентября 2009 г. 18:10, спустя 21 минуту 30 секунд

    зачем же так близко к седцу ? ну а в чем выебывание ? просто чтоб в ифрейме в был например не src=" а src=' - уже обход … а если какой параметр будет ? а еси небуит гет запроса ? вот мое предложение ( на скорую руку сверстано ) :
    /<iframe.+src=[\"|\'|h].+[\"|\'|.][^>]+.+<\/iframe>/is[/php]
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 сентября 2009 г. 18:13, спустя 3 минуты 14 секунд

    Dr.TRO, уже дельный комментарий, все что вы сказали - верно.

    Мой класс боролся только с ифраймами, которые были на одном крупном сайте, зараженном случайным образом, поэтому там нет такой гибкой регулярки.

    Вы всегда можете расширить этот класс, поэтому я его и выложил в паблик )
    adw/0
  • Dr.TRO

    Сообщения: 254 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 0:35, спустя 6 часов 21 минуту 48 секунд

    Не знаю, я бы лично педпочел shell-скриптинг здесь :)
    http://forum.codenet.ru/showthread.php?t=16393 - вот так вот лучше искать файлы с определенными расширениями (если дира то и ее открывать и там искать)
    Алсо пока поспал и помылсо перекинул регулярку лучше тогда уж:
    /(<iframe[^>]+><\/iframe>)/i
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 0:40, спустя 5 минут 35 секунд

    хороший топик. меня тьфу-тьфу-тьфу пока не коснулась эта гадость, но если что буду знать куда обратиться. спасибо adw0rd и Dr.TRO за компанию.
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 1:36, спустя 55 минут 22 секунды


    Не знаю, я бы лично педпочел shell-скриптинг здесь :)
    http://forum.codenet.ru/showthread.php?t=16393 - вот так вот лучше искать файлы с определенными расширениями (если дира то и ее открывать и там искать)
    Алсо пока поспал и помылсо перекинул регулярку лучше тогда уж:
    /(<iframe[^>]+><\/iframe>)/i
    Заказчику не понравилось, он сказал что вдруг повториться заражение, то пусть лучше будет пункт в админке для лечилки.
    adw/0
  • Dr.TRO

    Сообщения: 254 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 10:40, спустя 9 часов 3 минуты 49 секунд

    а какже system(), exec() ?)

    Ну это суто мое ИМХО, красноглазика) алсо лучше проделывать еще проверку - т.е. я не просто сделал захват полностью кода ифрейма, ибо только так код глянуть можно… вдруг случайн свой пихнеш куда ?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 10:43, спустя 3 минуты 49 секунд


    а какже system(), exec() ?)

    Ну это суто мое ИМХО, красноглазика) алсо лучше проделывать еще проверку - т.е. я не просто сделал захват полностью кода ифрейма, ибо только так код глянуть можно… вдруг случайн свой пихнеш куда ?
    если систем и ексек, то нахер тогда шел? или наоборот зачем тогда вообще пхп?
    adw/0
  • Dr.TRO

    Сообщения: 254 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 10:46, спустя 2 минуты 23 секунды

    нууу, тыж сказал шо с админки заказчик хотел (:

Пожалуйста, авторизуйтесь, чтобы написать комментарий!