Hack du fichier utf8.php, module StoreCommander sur Prestashop chez Hostinger

15/01/2020

Cela commence par une histoire plutôt classique de migration d'une boutique Prestashop et se termine par employer une veille technique de hack pour contourner la sécurité sur les fichiers PHP suspectés comme dangereux chez l'hébergeur Hostinger.

J'ai découvert à la suite d'une migration que cet hébergeur "analyse" les fichiers sources PHP que l'on dépose et se donne le droit (certainement pour des raisons de sécurité) de les supprimer. Certes cela prend une ligne à écrire mais j'ai passé beaucoup de temps avant de comprendre que quelques soit la méthode employée pour déposer/envoyer des fichiers, en quelques secondes, l'hébergeur peut les supprimer.

Dans mon cas, j'ai un seul fichier incriminé : modules/storecommande/XXXX/SC/lib/php/utf8.php
Seul problème, j'ai vraiment besoin de ce fichier car il fait partie du code de lancement du module StoreCommander. Après une rapide analyse de ce très long fichier de plus de 500ko qui est un condensé de code HTML/Javacript/PHP utilisant toutes les techniques les plus dégueulasses d'obfuscation de code, j'en conclus que je vais pas réussir à m'en sortir en tentant de nettoyer le code.
De plus, je sais que ce module utilise l'extension ionCube permettant de "protéger" du code PHP, je pense qu'il y a une partie du code obfusqué qui est un payload à charger pour cette extension, un beau bordel.

Puis me viens l'idée toute bête d'encapsuler le fichier dans un zip, qui sera décompressé et exécuté à la volée par l'interpréteur PHP.

modules/storecommande/XXXX/SC/lib/php/utf8fromzip.php
<?php 
$zip = new ZipArchive();
if(!$zip->open(SC_DIR.'lib/php/utf8.zip')) {
	exit("impossible d'ouvrir l'archive utf8.zip");
}

$fp = $zip->getStream('utf8.php');
if(!$fp) {
	exit("échec pour la récupération du flux utf8.php dans l'archive");
}

$content = '';
while (!feof($fp)) {
	$content .= fread($fp, 2);
}
fclose($fp);

eval(' ?>'.$content);

Plusieurs remarques :

Pour terminer, on modifie le lanceur pour intégrer notre nouveau fichier en lieu et place de l'ancienne inclusion.

modules/storecommande/XXXX/SC/init_sc.php
<?php 
//...
//require_once(SC_DIR.'lib/php/utf8.php');
require_once(SC_DIR.'lib/php/utf8fromzip.php');
//...

Et voilà, le module fonctionne!

Retour aux billets Billet plus ancien : Développement de ce site : Étape 1 - Définition des besoins et choix technologiques