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.

17 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.

  2. Bonjour

    mon site a été hacké par un malware, j’ai essayé votre script et j’obtiens le message suivant :
    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator to inform them of the time this error occurred, and the actions you performed just before this error.
    More information about this error may be available in the server error log.

    1. Bonjour,

      En complément de mon précédent message, pensez aussi à activer le debug Prestashop pour être certain qu’il n’y a pas une erreur fatale dans le comportement du script.

      A bientôt !

  3. Bonjour,
    je viens de tester le script sous prestashop 1.6.1.17 et j’obtiens une page « erreur 500 » à chaque fois ( hébergement 1&1 IONOS ).
    Le virus constaté sur mon site est l’ajout de nouveaux clients avec des liens sur des sites douteux ( bloqués par avast ),
    exemple:
    Prénom :Chat Sheila And Erin,
    Nom: http://www.cutt.us/ObdTG
    mail: toni-cappuzzo@hotmail.de.
    Et ceci, plusieurs fois par jour.
    Merci pour tous ces tutos.

  4. Bonjour

    J’ai un malware permanent mais je n’arrive pas à exécuter le script
    je viens de tester le script sous prestashop 1.7.5.1 et j’obtiens une page « erreur 504 » à chaque fois ( hébergement OVH ).

    merci pour votre aide

    1. Bonjour,

      Il faudrait augmenter le memory_limit / max_execution_time de votre serveur, je pense qu’il n’a pas les ressources nécessaires pour finaliser le traitement (à voir avec votre hébergeur si c’est possible de débloquer cela temporairement).

      A bientôt !

  5. Bonjour

    Tout d’abord merci pour tous ces articles très intéressants. J’ai suivi ce tuto antivirus. Je fonctionne sur le Prestashop 1.7.6.5 et actuellement à l’étape du nettoyage.

    Après avoir déposé les fichiers originaux du dossier de Prestashop dans mon site pour les corriger, ils sont toujours considérés comme infectés.
    Il peut s’agir de faux positifs, fait l’étape de chercher le code « eval » ou « base64 » est complexe pour moi.
    Puis-je passer directement à l’étape d’ajout des fichiers à la liste des exclusions dans le script ?

    Merci beaucoup,
    Cdt Magalie.

  6. Bonjour et surtout MERCI pour la qualité des videos et des tutos!!!
    J’ai juste cette erreur:
    « Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 611700440 bytes)……. »
    Où puis je modifier cette erreur?
    Bien cordialement
    Greg

    1. Bonjour,

      Il faudrait demander à votre hébergeur d’augmenter temporairement ces 2 valeurs « memory_limit » & « max_execution_time » pour le scanner et cela devrait fonctionner.

      A bientôt !

  7. Bonjour,
    j’ai beaucoup travaillé.
    je vous explique point par point:
    1. scan avec votre antivirus.php
    il me donne un résulat le meme que le php original phpMalCodeScanner.php
    je ne crois pas que ces fichiers soient infectés.
    j’ai fait différents scan sur ces fichiers sur mon pc (Jotti)
    est ce que je peux les ajouter à la wishlist? (fichiers acceptés par défaut)
    2. j’ai employé un deuxième scanneur: url ici
    https://github.com/ElmTheDev/PHPProtector
    qui me dit qu’il n’y a rien.

    pouvez-vs me dire s’il n’y aurait pas moyen de combiner les 2 fichiers phpprotector et le vôtre?

    merci d’avance,

    Xavier 😉

    1. Bonjour Xavier,

      Oui en fait le script peut retourner certains fichiers, mais ils ne sont pas forcément infectés comme par exemple :

      /themes/default/js/jquery.iframe-transport.js
      /themes/xxx/public/bundle.js
      /themes/xxx/public/main.bundle.js
      /vendor/prestashop/smarty/sysplugins/smarty_internal_function_call_handler.php
      /vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php
      

      En principe, si on ouvre le fichier, on voit assez vite si le code est déformé quelque part, avec un bout de code qui semble « douteux ».

Laisser un commentaire

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