Июл
17
2013

Как найти и удалить вирус на сайте, на примере MW:SPAM:SEO

14079093-virus-file-vektor-illustration

Вы наверно уже знаете, что вирусы заражают не только файлы на компьютере, но и страницы в интернете. Сегодня мы поговорим о том как найти и удалить вирус на сайте, на примере довольно безобидного, но все же неприятного, вируса категории MW:SPAM:SEO.

Что же из себя представляет этот самый вирус, скрывающийся за страшной аббревиатурой MW:SPAM:SEO? Все не так страшно, MW — malware — вредоносная программа, целью которой является поднятие SEO показателей сайта нарушителя, что представлено в виде ссылки этот самый сайт, а для остальных это просто спам.

Как найти вирус на сайте?

Наиболее надежным способом обнаружить вирус на сайте, является проверка онлайн-сканерами, такими как всем известный VirusTotal и ориентированный на проверку сайтов sucuri.net, правда на английском языке, но зато позволяет подробнее узнать о заражении. Для вашего удобства ниже приведены ссылки на эти сервисы :)

VirusTotal sucuri.net

Заходим на страницу сканера, вбиваем адрес интересующего сайта и получаем отчет о проверке. VT пишет только название найденного заражения и все, в то время как sucuri.net приведет вам участок кода, в котором обнаружена угроза, и сообщит о принятых в отношении вас мерах, со стороны поисковых систем (да, там есть и Яндекс).

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

Как удалить вирус на сайте?

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

Самый простой способ найти вирус на сайте, если вы вообще не знаете в какую сторону копать — это скачать на свой компьютер все php файлы вашей CMS, открыть их Notepad++, копировать фрагмент вредоносного кода и «Найти во всех открытых файлах». Ну а потом закачать исправленный файл на место.

Опять же, хитрый нарушитель может может не только встроить свой код, но и частично «зашифровать» (base64) часть кода вашей темы. И может получиться, что полностью удалив подозрительный код вы приведете свою тему оформления в нерабочее состояние (разрывы шаблонов в странице, неправильное отображение, ошибки интерпретации php после поврежденного участка). Но и тут все не так плохо. Есть такая замечательная ведь как http://jsbeautifier.org/ с помощью которой можно тарабарщину вроде

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 8(){e a=0,m,6,t,5,3=c g(\'i\',\'k\',\'o\',\'b\'),l=3.7;f(++a<=l){m=3[l-a];t=5=\'\';d(6=0;6<m.7;){t+=m.j(6++);h(t.7==2){5+=n.p(q(t)+r-l+a);t=\'\'}}3[l-a]=5}s.u(\'<\'+3[0]+\' \'+3[4]+\'>.\'+3[2]+\'{\'+3[1]+\'}</\'+3[0]+\'>\')}8();',31,31,'|||x||z|v|length|dnnViewState|function||949990793917947998942577939317|new|for|var|while|Array|if|9091968376|charAt|8887918192818786347374918784939277359287883421333333338896|||String|778787|fromCharCode|parseInt|25|document||write'.split('|'),0,{}))

превратить во вполне удобоваримый код

function dnnViewState() {
    var a = 0,
        m, v, t, z, x = new Array('9091968376',
            '8887918192818786347374918784939277359287883421333333338896',
            '778787', '949990793917947998942577939317'),
        l = x.length;
    while (++a <= l) {
        m = x[l - a];
        t = z = '';
        for (v = 0; v < m.length;) {
            t += m.charAt(v++);
            if (t.length == 2) {
                z += String.fromCharCode(parseInt(t) + 25 - l + a);
                t = ''
            }
        }
        x[l - a] = z
    }
    document.write('<' + x[0] + ' ' + x[4] + '>.' + x[2] + '{' + x[1] +
        '}')
}
dnnViewState();

После избавления от вируса не забудьте изменить атрибуты доступа к сайту — пароль администратора и пароль от FTP.

Как же работает этот вирус?

Нарушитель каким-то образом получает доступ к вашему сайта (через админку\ftp) и встраивает следующий код:

<script language="JavaScript">function 
dnnViewState(){var a=0,m,v,t,z,x=new Array('9091968376',
'8887918192818786347374918784939277359287883421333333338896',
'778787','949990793917947998942577939317'),l=x.length;
while(++a<=l){m=x[l-a];t=z='';for(v=0;v<m.length;){t+=m.charAt(v++);
if(t.length==2){z+=String.fromCharCode(parseInt(t)+25-l+a);t=''}}x[l-a]=z}
document.write('<'+x[0]+' '+x[4]+'>.'+x[2]+'{'+x[1]+'}</'+x[0]+'>')}
dnnViewState();</script>
<a href="злойхакер.рф">Логово Злоботрона</a>

Сразу можно заметить ссылку на посторонний сайт, ради которой нарушитель все и затевал. Однако при просмотре сайта эту ссылку не видно. В чем же дело? А дело как раз в js-коде идущем перед ссылкой. Если мы откроем исходный код открытой страницы, то увидим что перед ссылкой добавилась строчка

<style undefined="">.dnn{position:absolute;top:-9999px}</style>

Которая собственно и скрывает спамную ссылку, сдвигая ее на 9999 пикселей выше заголовка окна.  На 9999 пикселей обычно сдвигают текст ссылки логотипа сайта, так что вероятно поисковые машины относятся к этому лояльно, и передают этой ссылке часть веса вашей страницы.

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

    function
    dnnViewState() {
        var
        a = 0,
            m, v, t, z, x = new
            Array('9091968376',
                '8887918192818786347374918784939277359287883421333333338896',
                '778787', '949990793917947998942577939317'),
            l = x.length;
        while (++a <= l) {
            m = x[l - a];
            t = z = '';
            for (v = 0; v < m.length;) {
                t += m.charAt(v++);
                if (t.length == 2) {
                    z += String.fromCharCode(parseInt(t) + 25 - l + a);
                    t = '';
                }
            }
            x[l - a] = z;
        }

        document.write(
            '<' + x[0] +
            ' ' + x[4] +
            '>.' + x[2] +
            '{' + x[1] +
            '}</' + x[0] +
            '>');
    }

    dnnViewState();

Скрипт перебирает элементы массива, расшифровывает их и вставляет в страницу строку с css стилем прячущим ссылку от посетителей.

Элементы массива перебираются с конца. Затем считывается по 2 символа текущего элемента массива, приводятся к int. Потом с этим значением проводятся нехитрые манипуляции parseInt(t) + 25 — l + a, где l -число элементов массива, а — счетчик дешифруемого элемента массива. В итоге получатся char номер символа в таблице символов, который и записывается в промежуточную переменную z. Достигнув конца элемента массива скрипт заменяет его дешифрованной версией (хранится в z). А затем собирает итоговую строку и внедряет ее в страницу.

Немного об авторе: Сергей Белянин

Основной автор этого блога. Еще совсем недавно студент, а сегодня уже Microsoft Certifed Professional, с неукротимым желанием сделать жизнь людей проще, автоматизировав скучную рутинную работу :)