Antivirus Prestashop & Wordpress

Un antivirus gratuit pour WordPress & Prestashop

Il y’a quelques mois en arrière, j’ai été confronté à de gros problèmes de hacking sur WordPress et Prestashop. Difficile de savoir si les fichiers sur l’hébergement sont ensuite « clean » lorsqu’on a été piraté, faisons un test ensemble.

Des problèmes avec l’hébergeur

A un moment donné, le problème du hacking est tellement devenu critique, que mon hébergeur bloquait en permanence mon site et me fournissait un rapport des fichiers infectés. C’était sans fin, car une fois les fichiers corrigés d’un côté… le virus se propageait ailleurs et dans tous les répertoires.

Du coup, vous pouvez vous trouver avec un site complètement saturé par des mauvais scripts et cela continue de se propager. La faille a démarré à mon sens dans WordPress, puis s’est propagé sur la boutique Prestashop et au final beaucoup de fichiers ont été infectés.

Le virus en question peut prendre différente forme et être très vicieux, parfois il se loge en début ou fin de fichier et tiens parfois sur 1 ligne. Au premier coup d’oeil le fichier semble bon, mais plus loin on peut trouver du code malsain encodé.

Le code du virus s'étend sur plusieurs lignes, ici difficile de le rater. Mais quand vous avez des milliers de fichiers à vérifier... c'est délicat.
Le code du virus s’étend sur plusieurs lignes, ici difficile de le rater. Mais quand vous avez des milliers de fichiers à vérifier… c’est délicat.

Antivirus PHP

Mon but c’était de trouver un scanner facile à utiliser, qui puisse vérifier tout mon hébergement et localiser les potentielles grosses failles qui sont exploitées par la plupart des hackers. En PHP des failles peuvent être exploitées en modifiant un fichier et en lui faisant exécuter des commandes comme « eval » ou « base64 ». Je suis tombé sur ce topic qui traitait de cette problématique et qui proposait un script PHP.

De mon côté j’ai repris ce code et je l’ai légèrement adapté pour qu’il puisse fonctionner au mieux avec mes exigences. Le concept est tout simple, vous allez mettre un fichier « antivirus.php » à la racine de votre site ou de votre hébergement (avec le contenu ci-dessous). Sinon vous pouvez télécharger aussi directement le fichier Antivirus PHP au format compressé.

<?php

/* 
 * Webbax - Scanner Antivirus
 * Plugin revisité pour assurer un scan WP & Prestashop
 */

/*
Plugin Name: php Malicious Code Scanner
Plugin URI: http://www.mikestowe.com/phpmalcode
License: GPL-2
*/

define('SEND_EMAIL_ALERTS_TO','mail@gmail.com');

class phpMalCodeScan {
        
    public $infected_files = array();
    private $scanned_files = array();

    function __construct() {
        $this->scan(dirname(__FILE__));
        $this->sendalert();
    }

    function scan($dir){
        $this->scanned_files[] = $dir;
        $files = scandir($dir);
        if(!is_array($files)) {
            throw new Exception(utf8_decode('Impossible de vérifier le dossier').' '.$dir.' '.utf8_decode('Veuillez vérifier que vous avez bien les permissions nécessaires.'));
        }
        foreach($files as $file) {
            if(is_file($dir.'/'.$file) && !in_array($dir.'/'.$file,$this->scanned_files)) {
                $this->check(file_get_contents($dir.'/'.$file),$dir.'/'.$file);
            }elseif(is_dir($dir.'/'.$file) && substr($file,0,1) != '.') {
                $this->scan($dir.'/'.$file);
            }
        }
    }

    function check($contents,$file) {      
        $this->scanned_files[] = $file;      
        if(preg_match('/eval\((base64|eval|\$_|\$\$|\$[A-Za-z_0-9\{]*(\(|\{|\[))/i',$contents)) {
            $files_wishlist_found = false;
            $files_wishlist = $this->getFilesWishlist();
            foreach($files_wishlist as $file_wishlist){
                if(strpos($file,$file_wishlist)!==false){
                    $files_wishlist_found = true;
                    break;
                }
            }
            if(!$files_wishlist_found){
                $this->infected_files[] = $file; 
            }
        }
    }
    
    function sendalert() {  
        if(count($this->infected_files) != 0){
            $title = 'Virus potentiels trouvés';
            $message = '== '.$title.' =='."\n\n".'<br/>';
            $message .= 'Ces fichiers pourraient être infectés'." : \n".'<br/><br/>';
            foreach($this->infected_files as $inf) {
                $message .= " - $inf \n".'<br/>';
            }
        }else{
            $title = 'Aucun virus détecté sur l\'hébergement';
            $message = 'Félicitation, actuellement tout semble correct !';
        } 
        echo 
        '<!doctype html>
            <html lang="fr">
            <head>
              <meta charset="utf-8">
              <title>Scanner</title>
            </head>
            <body>'.
                $message.'<br/>
                Le scan est terminé !
            </body>
        </html>'; 
        $message = str_replace('<br/>','',$message);
        mail(SEND_EMAIL_ALERTS_TO,utf8_decode($title),utf8_decode($message),'FROM:');
    }

    /*
     * Fichiers autorisés
     * @param - 
     * @return array
     */
    function getFilesWishlist(){
        $wishlist = array();
        $wishlist[] = '/wp-content/plugins/popup-by-supsystic/classes/Twig/Test/IntegrationTestCase.php';
        $wishlist[] = '/administration/themes/default/js/jquery.iframe-transport.js';
        $wishlist[] = '/tools/smarty/sysplugins/smarty_internal_function_call_handler.php';
        return $wishlist;
    }
}

ini_set('memory_limit', '-1'); 
new phpMalCodeScan;

?>

Ce que vous devez modifier c’est la ligne du code ci-dessous en mettant votre adresse e-mail afin de recevoir une copie du résultat par email.

define('SEND_EMAIL_ALERTS_TO','votremail@gmail.com');

Comment l’utiliser ?

A présent il suffit simplement d’exécuter l’url vers le script ex : http://www.votresite.com/antivirus.php et le processus va commencer à se charger. Attention, cela peut prendre plusieurs minutes, tout dépendra du volume de fichiers à scanner sur votre site.

Pas de virus
Si vous avez de la chance vous obtiendrez ce message affiché à l’écran. Dans ce cas, il n’y a rien à faire sur votre hébergement.
Virus détecté
Si vous avez moins de chance, une liste de fichiers potentiellement infectés va s’afficher. Si c’est le cas, vous devez passer à l’étape suivante.

Nettoyer le virus

Si vous avez des erreurs affichées, voilà ce que je peux vous conseiller dans un premier temps :

  • Remplacez les fichiers infectés par les fichiers d’une source sûre ex. d’un backup. Sinon re-téléchargez une archive de votre WordPress ou Prestashop et remplacez les fichier infectés par les fichiers originaux fournis de base. Ensuite, relancez l’antivirus.
  • Si les fichiers sont toujours considérés comme infectés, il peut s’agit de faux positifs, dans ce cas, il faut ouvrir le fichier et chercher le code « eval » ou « base64 » pour voir si la manière de faire est bien correct (pour cela il faut des connaissances en développement). S’il s’agit d’un faux-positif, alors passez au point suivant (sinon il faudra retirer le fichier).
  • Dans le cas d’un faux positif, il faut ajouter le fichier à la liste des exclusions dans le script, pour cela il suffit d’ajouter de nouveaux éléments dans le tableau « $wishlist » à la ligne 96 du script php.
Exclusions virus
L’antivirus a une compréhension très limitée, il faut donc lui indiquer les faux positifs. Normalement, vous ne devriez pas en avoir beaucoup à citer.

Bloquer l’attaque

Une fois que vous avez un résultat positif, je conseille de laisser ainsi… par contre il se peut que vous soyez hacké à nouveau 1 jour plus tard. Si c’est le cas, vous pouvez faire ceci, remettez en place à nouveau les fichiers sains, puis mettez le/s dossiers ou fichiers impactés en CHMOD 555 sur votre hébergement (seulement ceux concernés).

Dans mon cas j’ai dû utiliser cette méthode, car la faille exacte n’a pas pu être identifiée, depuis cela fait un bon mois que le site n’a plus été gravement hacké, cela s’explique entre autre par cette restriction du CHMOD.

Le CHMOD 555 peut vous sauver dans certains cas graves.
Le CHMOD 555 peut vous sauver dans certains cas graves.

Bilan

C’est très pénible d’être victime de hacking, votre entreprise peut-être déstabilisée rapidement, ainsi que votre crédibilité. Actuellement j’ai mis en place une tâche planifiée qui exécute tous les jours ce script sur l’hébergement. Cela me permet d’être notifié chaque jour pour savoir si tout est ordre ou si je dois aller regarder un fichier suspect. Bien sûr il faut aussi prendre d’autres précautions (installez par ex. Wordfence ou WP Sécurity), mais dans ce billet je voulais surtout vous présente la problématique liée aux fichiers infectés.

Notez mon billet, Google va adorer :
1 étoiles - J'aime pas !2 étoiles - Bof !3 étoiles - Bien !4 étoiles - Très bien !5 étoiles - Génial ! (1 votes, moyenne : 5,00 sur 5)
Loading...

4 commentaires sur “Un antivirus gratuit pour WordPress & Prestashop”

  1. Bonjour,
    Votre script semble très intéressant, aussi je l’ai installé sur mon serveur qui fait tourner un Prestashop et une dizaine de multiboutiques pour vérifier qu’il soit clean.
    Toutefois j’ai un msg d’erreur apès une trentaine de sec :
    « Fatal error: Maximum execution time of 30 seconds exceeded in /home/cosmetic/public_html/antivirus.php on line 33 »
    Comment augmenter cette valeur ?
    (sans risquer de compromettre la sécurité liée aux scripts…)
    Merci pour vos articles toujours très pertinents.
    Bien cordialement
    Bruno

    1. Effectivement ce plugin me semble aussi intéressant, il faudra que le je teste si je dois faire face à des attaques encore plus virulentes.

      C’est vrai que c’est une possibilité, seulement actuellement j’ai beaucoup de customisations en place et le temps disponible se restreint (pour repartir de zéro). C’est aussi un challenge de trouver la manière de sortir d’une boucle de hacking.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *