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é.
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.
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.
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.
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.
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
Bonjour,
Il s’agit d’une limitation par Infomaniak, pour cela vous pouvez essayer le déblocage suivant :
https://www.infomaniak.com/fr/support/faq/2121/debloquer-les-limites-dun-site-memoire-et-temps-dexecution-des-scripts
Merci pour votre visite !
Sur WordPress, je te conseille iThemes Security pour séries ton site.
https://fr.wordpress.org/plugins/better-wp-security/
Plutôt courageux d’essayer de tout nettoyer à la main. 😉 Je préfère repartir avec une clean install si je constate un piratage.
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.
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.
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 !
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.
Bonjour,
A voir le dernier tutoriel qui traite de ce point concernant les SPAM des comptes clients Prestashop : https://www.webbax.ch/2019/04/25/prestashop-1-7-spam-compte-client-ep-75/
A bientôt !
Ça fonctionne ! Depuis hier, plus de comptes clients factices ! Merci !
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
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 !
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.
Bonjour,
Oui bien souvent il s’agit de « faux » positifs, mais vous pouvez les ajouter à la liste des exclusions. Vous pouvez aussi regarder ce tutoriel qui concerne le nettoyage d’un site Prestashop piraté : https://www.webbax.ch/2020/09/10/prestashop-anti-hacking/
A bientôt !
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
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 !
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 😉
Bonjour Xavier,
Oui en fait le script peut retourner certains fichiers, mais ils ne sont pas forcément infectés comme par exemple :
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 ».