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

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

  • adw0rd

    Сообщения: 22902 Репутация: 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(&#39;~\.&#39;.$this->ignoreExts.&#39;~&#39;, $fullFileName) or $fileSPLObject->isDir()) {
                   continue;
               }

               $this->fullFilesCount++;
               
               $this->fileContent = file_get_contents($fullFileName);
               $position = strpos($this->fileContent, &#39;<iframe&#39;);
               
               if($position !== false) {
                   
                   $pf = preg_match_all(&#39;~<iframe src=\&quot;(.*?)\&quot;.*?</iframe>~s&#39;, $this->fileContent, $matches);
                   
                   if(!$pf) {
                       continue;
                   }
                   
                   $shortFileName = substr($fullFileName, $this->directoryLength);
                   $this->infectionFilesCount++;
                   
                   $this->resultList[] = array(
                       &#39;full_path&#39; => $fullFileName,
                       &#39;short_path&#39; => $shortFileName,
                       &#39;iframe&#39; => $matches[0],  
                       &#39;src&#39; => $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[&#39;full_path&#39;]);
               $fileContent = str_replace($file[&#39;iframe&#39;], &#39;&#39;, $fileContent);
               file_put_contents($file[&#39;full_path&#39;], $fileContent);
               $count++;
           }
           
           return $count;
       }
       
       public
           $directory = &#39;&#39;,
           $directoryLength = 0,
           $ignoreExts = &#39;(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)&#39;,
           $fullFilesCount = 0,
           $infectionFilesCount = 0,
           $fileContent = &#39;&#39;,
           $resultList = array();
    }

    ?>



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


    <?php

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

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

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

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

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


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


    <?php

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

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


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

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

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

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

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

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

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

    $ignoreExts = &#39;(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)&#39;,


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

    PS 3434
  • adw0rd

    Сообщения: 22902 Репутация: 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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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