=')) {$limited = true;} @ini_set('default_socket_timeout', 300); @date_default_timezone_set('Europe/Paris'); register_shutdown_function('postmortem'); $start_time = microtime(true); $ok = ($memory_limit == '-1') || ($memory_limit >= 512 * 1024 * 1024); // at least 512M? if(!$ok) { die('La mémoire disponible sur votre serveur ('.$memory['display'].') est insuffisante pour exécuter ce script, veuillez l\'augmenter à 512 MB au minimum'); } if(version_compare(phpversion(), '7.3.0', '<')) { @ini_set('pcre.jit',0); @ini_set('pcre.backtrack_limit',2148576); @ini_set('pcre.recursion_limit',2148576); } else { @ini_set('pcre2.jit',0); @ini_set('pcre2.backtrack_limit',2148576); @ini_set('pcre2.recursion_limit',2148576); } if(function_exists('newrelic_ignore_transaction')) { newrelic_ignore_transaction(); } $root_path = getcwd().'/'; $root_directory = basename($root_path); $updating = false; $protocol = $_SERVER['HTTPS'] ? 'https://' : 'http://'; $arrContextOptions = array( "ssl" => array( "verify_peer" => false, "verify_peer_name" => false, ), 'http' => array( 'header' => array("Referer: ".$protocol.$_SERVER['HTTP_HOST']) ) ); $admin_dir = false; $found = $files = 0; header('Proceed: '.__LINE__); $directory = new RecursiveDirectoryIterator('.'); $directory = new DirFilter($directory); $scan = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST); $admins = []; foreach($scan as $file) { $files++; if($file->getFilename() == 'get-file-admin.php') { $found++; $admins[] = dirname($file); if($found == 1) { $admin_dir = str_replace('./', '', dirname($file)); } } } $first_scan = 'Listing initial des '.$files.' fichiers effectué en '.round(microtime(true) - $start_time, 3).' sec. '; $html = '

Script de nettoyage et contrôle pour boutiques PhenixSuite/Prestashop by @eolia, version ' . $version .'
Ce script est fourni gracieusement et en aucun cas son utilisation ne peut être payante ou facturée. Concernant les versions 8 et suivantes le contrôle d\'intégrité n\'est plus effectué.

'.PHP_EOL; if($found > 1) { die($html.'Plusieurs répertoires de type /admin ont été trouvés.
Veuillez supprimer ceux qui sont inutiles ou le script ne saura pas lequel analyser
'.print_r($admins, 1).'
'); } if(!$admin_dir) { die($html.'CMS inconnu. Script interrompu'); } $encoded = substr(md5($root_path . $admin_dir), 0, 12); $latest_filename = $encoded.'.php'; $current_url = strtok((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", '?'); $current_script = basename($current_url); $new_url = str_replace($current_script, $latest_filename, $current_url); $suspicious_zip = new ZipArchive(); $old_zip_filename = $root_path.'suspicious.zip'; $daily_zip = $root_path.'suspicious_'.$encoded.'-'.date('Y-m-d').'.zip'; $list = glob($root_path.'suspicious_'.$encoded.'-*zip'); foreach($list as $file) { if(time() - filemtime($file) > 86400*7) { unlink($file); } } $zip_filename = $root_path.'suspicious_'.$encoded.'.zip'; $zip_url = str_replace($latest_filename, 'suspicious_'.$encoded.'.zip', $current_url); if(file_exists($old_zip_filename)) { @unlink($zip_filename); } if(file_exists($zip_filename)) { @unlink($zip_filename); } $upd_fm_message = ''; if(isset($_POST['update_filemanager'])) { $zip = 'https://devcustom.net/public/scripts/filemanager.zip'; $ext = pathinfo($zip, PATHINFO_EXTENSION); $fm_zip = tempnam(sys_get_temp_dir(), $ext); copy($zip, $fm_zip, stream_context_create($arrContextOptions)); if(file_exists($fm_zip) && strlen($fm_zip)) { $zip = new ZipArchive; if($zip->open($fm_zip) === TRUE) { cleanDirectory($root_path.$admin_dir.'/filemanager'); $zip->extractTo($root_path.$admin_dir); $zip->close(); $upd_fm_message = 'Le répertoire '.$root_directory.'/**admin**/filemanager a été patché avec succès.'.PHP_EOL.PHP_EOL; } else { $upd_fm_message = 'Impossible de mettre à jour le répertoire '.$root_directory.'/**admin**/filemanager'.PHP_EOL.PHP_EOL; } } @unlink($fm_zip); } if(!preg_match('/modules/i', $root_path) && file_exists('init.php')) { header('Proceed: '.__LINE__); $fgc = @file_get_contents('https://devcustom.net/public/cleaner.txt', false, stream_context_create($arrContextOptions)); if($fgc) { if($current_script != $latest_filename || preg_match('/version = \'(.+)\'/i', $fgc, $matches)) { if($current_script != $latest_filename || version_compare($matches[1], $version, '>')) { if(preg_match('/class_index\.php/', $fgc)) { if(!file_put_contents($latest_filename, $fgc.PHP_EOL .'/* Version téléchargée depuis devcustom.net - ' . date('Y-m-d H:i:s') .'*/')) { die('Impossible de mettre à jour le fichier. Permissions en écriture insuffisantes'); } else { if($current_script == 'cleaner.php') { file_put_contents('cleaner.php', $fgc); } if($current_script != $latest_filename) { if(file_exists($root_path.$current_script)) unlink($root_path.$current_script); $list = glob($root_path.'suspicious_*zip'); foreach($list as $file) { unlink($file); } } } if(file_exists($latest_filename)) { header('Refresh: 1; url='.$new_url); echo $html; echo $upd_fm_message; echo 'Votre version doit être mise à jour. Téléchargement de la dernière version '.(isset($matches) ? $matches[1] : '').' et exécution...'; sleep(2); $updating = true; } } } else { $html .= $upd_fm_message; $html .= '

Mémoire OK ('.$memory['display'].'). Vous avez la dernière version à jour du script -> Démarrage...
Vous pouvez créer une tache cron dans le module cronjobs 1 fois par semaine en appelant '.$current_url.' automatiquement et recevoir le résultat par mail.

'; } } } else { $html .= '

Mémoire OK. Contrôle de version impossible -> Démarrage avec la version actuelle...
Vous pouvez créer une tache cron dans le module cronjobs 1 fois par semaine en appelant '.$current_url.' automatiquement et recevoir le résultat par mail.

'; } } else die('
Ce script doit être placé à la racine de votre site (là où est installé votre Prestahop sur votre ftp) et nulle part ailleurs
'); if(!$updating) { $html .= $first_scan.')

'; //$array = iterator_to_array($scan, false); //ksort($array); //$scan = new ArrayIterator($array); if($current_script != 'cleaner.php') { $html .= '

Par sécurité l\'url du script a été modifiée. Notez la nouvelle url si vous fermez cette page.
Si vous avez oublié l\'url, relancez cleaner.php après l\'avoir re-téléchargé

'; if(file_exists($root_path.'cleaner.php')) { @unlink($root_path.'cleaner.php'); } } $integrity = true; $zip_ok = true; if($suspicious_zip->open($zip_filename, ZipArchive::CREATE) !== TRUE) { $zip_ok = false; } @ini_set('display_errors', 0); error_reporting(0); $md5_list = false; if(version_compare(_PS_VERSION_, '1.6.1.26', '>=') && version_compare(_PS_VERSION_, '1.7.0.0', '<')) { $api_url = 'https://devcustom.net/public/scripts/xml/'._PS_VERSION_.'.json'; } else { $api_url = 'https://md5.enter-solutions.com/json/'._PS_VERSION_.'.json'; } header('Proceed: '.__LINE__); $md5_file = file_get_contents($api_url, false, stream_context_create($arrContextOptions)); if(version_compare(_PS_VERSION_, '8.0.0.0', '>')) { $md5_file = false; } if($md5_file) { $md5_list = json_decode($md5_file); } if(!is_object($md5_list)) { $md5_list = false; } $admin = Db::getInstance()->getRow(' SELECT `email`, `lastname`, `firstname` FROM `'._DB_PREFIX_.'employee` WHERE `id_profile` = 1 AND `active` = 1 ORDER BY '.(version_compare(_PS_VERSION_, '1.6.0.0', '>=') ? '`last_connection_date` DESC,' : '').' `id_employee`'); $html .= 'Si des messages de nettoyage ou suppression sont affichés en rouge, votre e-boutique est susceptible d\'avoir été attaquée et a été protégée d\'urgence
mais il est nécessaire de RESTAURER les fichiers modifiés, de CHANGER le nom de votre répertoire admin et de CHANGER les mots de passe des employés de votre boutique
.'.PHP_EOL.PHP_EOL; if(empty($md5_list)) { $integrity = false; $html .= 'Fichiers source ignorés pour cette version: '._PS_VERSION_ .'. Les contrôles md5 ne seront pas effectués.
'; } else { header('Proceed: '.__LINE__); } // START $force = true; $key = $bad = $bad1 = $bad2 = $bad3 = $found_admin = $error_js = $bad_perms = $bad_image = $error_line = $bad_found = $bad_infected = $bad_heuristic = 0; $indexes = $not_exist = $escaped = ''; $full = isset($_POST['full']); $files_perm = '

Contrôle des droits:

'; $dot_files = '

Recherche de fichiers .xxx ajoutés connus comme étant des infections:

'; $htaccess_files = '

Recherche de fichiers htaccess ajoutés ou modifiés:

'; $admin_files = '

Contrôle des fichiers admin:

'; $heuristic = '

Contrôle sur les fichiers sensibles connus pour être modifiés:

'; $scripts = '

Contrôle des scripts JS:

'; $images = '

Contrôle des images pouvant contenir un script:

'; $infects = '

Recherche des infections connues:

'; $bad_added_files = '

Contrôle de sécurité sur fichiers indésirables connus:

'; $core_control = '

Contrôle de sécurité sur les fichiers php coeur:

'; $modules = '

Recherche de vulnérabilité sur les modules (A titre d\'information. Si vous ne savez pas interpréter le code, veuillez demander l\'avis d\'un professionnel):

'; $to_be_monitored = 'config\/alias\.php|\/config\/config\.inc\.php|\/classes\/db\/Db\.php|\/classes\/Dispatcher\.php|\/classes\/Hook\.php|\/controllers\/front\/IndexController\.php|\/classes\/module\/Module\.php|\/classes\/controller\/FrontController\.php|\/tools\/smarty\/sysplugins\/smarty_internal_templatebase\.php'; $unwanted = '\/XsamXadoo_Bot\.php|^acjvwqih\.php|^bsedtnmx\.php|^rgkpuyoi\.php|^zok\.php|^z\.php|^yetim\.php|^samax\.php|^wevgodux\.php|^noxmox\.php|\/XsamXadoo_deface\.php|\/0x666\.php|\/f\.php|umcds\.php|\/eval-stdin\.php|\/Xsam_Xadoo\.html|\/xsamxadoo\.php|\/xsamxadoo1\.php|\/haxor\.php|\/h4x0r\.html|\/haxor\.html|\/phantom\.html|\/new_readme\.php|\/404\.php|\/wp-log\.php|\/a\.txt|\/archive\.php|\/Gass\.html|\/19855c\.php|\/gasshop\.php|\/getfile\.php|\/m\.php|\/m1\.php|\/moban\.html|\/popup-pomo\.php|\/up\.php|\/V2-plug\.php|^upload\.php|\/xboo\.php\.png|wS0(?: |\.Phtml|\.php)|\/xGASSx\.php|\/02ea|\/zaz\.php|\/zip\.php|^hous\.php\.png|\/cache\/update\.php|\/classes\/tmp\/|\/classes\/module\/tmp\/|\/controllers\/front\/tmp\/|\/modules\/tmp\/|karakaroa\.php|\/config\/tmp\/|\/Core\/tmp\/|^ini\.php|\/web-right\.php|\/\.f26945b1\.ico|/translations\/content\.php|\/MARIJUANA\.php|\/jj\.php|\/syng\.php|\/new\.php|\/wp-login\.php|\/alfanew\.php|\.\/upgrade\.php|\/crack_self_restore\.php|\/checkbex\.php|\/down\.php|\/enfile\.php|\/gh\.php|\/pinuseren\.php|\/wp-head\.php|\/wp-site\.php|\/wp-info\.php|\/wp-admin\.php|^Licensse\.php|wp-includes\.php|\/wp-config-sample\.php|\/jiema\.php|\/cangma\.php|\/cawpf\.php|\/nowp\.php|\/nowpf\.php|\/cyborg_tmp\.php'; $class_regex = '~ ^\s*(?:abstract)?\s*(?:class|interface|trait)\s+ (?P\S+)[^{}]+(\{ (?:[^{}]*|(?2))* \})~mx'; $function_regex = '~ ^\s*function \s+ (?\w+)\s* \((?[^\)]*)\)\s* (?\{(?:[^{}]+|(?&body))*\}) ~mx'; $re = '/(?:\/\*([^*]|(\*+([^*\/])))*\*\/)|(?:\/\/.*$)|(?:#.*$)|(?:\'(?:[^\'\\\\]|\\\\.)*\'|"(?:[^"\\\\]|\\\\.)*")/mU'; $bad_writable = array(777, 0777, 40777); foreach($scan as $file) { $count_files++; $filename = $file->getFilename(); if(($filename != '.') && ($filename != '..')) { if(in_array(decoct(fileperms($file)), $bad_writable)) { $bad_perms++; if($file->isDir()) { $files_perm .= 'Droits incorrects (777) pour le répertoire: '.str_replace('.', '', $file).'. Doit être 755
'; } else { $files_perm .= 'Droits incorrects (777) pour le fichier: '.str_replace('.', '', $file).'. Doit être 644
'; } } } $script_name = str_replace('./', '', str_replace('./'.$admin_dir, 'admin', $file)); // Unwanted header('Proceed: '.__LINE__); if(preg_match('/'.$unwanted.'/i', $file, $matches)) { if(version_compare(_PS_VERSION_, '1.6.0.0', '<') && ($file == './404.php')) { continue; } if(file_exists($file)) { $fgc = file_get_contents($file); $bad_found++; $bad_added_files .= displayFileError('red', 'Fichier indésirable détecté '.$matches[0], $script_name, $fgc); if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(unlink($root_path.$file)) { $bad_added_files .= 'Fichier '.$script_name.' indésirable supprimé
'; } else { $bad_added_files .= '!!! Échec de la suppression de ce fichier - '.$script_name.' - contactez votre hébergeur pour le faire (le fichier est protégé contre la suppression)' .'
'; } } continue; } // Bad dot files header('Proceed: '.__LINE__); if($path_parts == 'php') { $full_path = explode('/', $file->getPathname()); $item_file = array_pop($full_path); if(is_array($full_path) && (count($full_path) > 1)) { if($item_file == '.'.end($full_path).'.php') { $bad1++; $fgc = file_get_contents($file); if(!unlink($file)) { $dot_files .= displayFileError('red', 'Fichier dangereux à supprimer impérativement (échec de la suppression):', $file, $fgc); } else { $dot_files .= displayFileError('red', 'Fichier dangereux supprimé', $file, $fgc); } continue; } } } // Scan bad modules names header('Proceed: '.__LINE__); if(($filename != '.') && ($filename != '..') && $file->isDir() && (dirname($file) == './modules') ) { if(preg_match('~.+(?:_|__|\.old|_old|\.bak|\.zip|_bak|sauv_|bkp|-|--|gapi|karakaroa|ps_analytics)$~i', $file)) { $modules .= 'Répertoire indésirable détecté (à supprimer ou à sauvegarder ailleurs): '.str_replace('.', '', $file).'
'; } continue; } if(($filename != '.') && ($filename != '..') && !$file->isDir() ) { if(preg_match('/\.\/themes\/|\.\/log\/|\/cache\/class_index\.php|\/sytem\/|\/sytems\/|\/cache\/classes\/index\.php/', $file)) { continue; } $path_parts = $file->getExtension(); if(!$full && filesize($file) > 450*1024) { if(in_array($path_parts, array('php', 'js', 'sql'))) { $escaped .= '- '.$script_name.' ('.round(filesize($file)/1024).' Ko)
'; } continue; } // Integrity modules directory header('Proceed: '.__LINE__); if(dirname($file) == './modules') { if(($filename != '.htaccess') && !$path_parts) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } $fgc = file_get_contents($file); $modules .= displayFileError('orange', 'Fichier sans extension détecté', $file, $fgc); continue; } else { if(!in_array($filename, array('index.php', '.htaccess'))) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } $fgc = file_get_contents($file); if(!unlink($file)) { $modules .= displayFileError('red', 'Fichier indésirable à supprimer impérativement (échec de la suppression):', $file, $fgc); } else { $modules .= displayFileError('red', 'Elément indésirable supprimé dans /modules', $file, $fgc); } continue; } } } // Bad htaccess files header('Proceed: '.__LINE__); if($filename === '.htaccess') { $fgc = file_get_contents($file); if(preg_match('/suspected/i', $fgc, $mmatches, PREG_OFFSET_CAPTURE)) { $bad2++; if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(filesize($file) < 150) { if(!unlink($file)) { $htaccess_files .= displayFileError('red', 'Fichier .htaccess ajouté à supprimer impérativement (échec de la suppression):', $file, $fgc); } else { $htaccess_files .= displayFileError('red', 'Fichier .htaccess indésirable supprimé', $file, $fgc); } } else { $bad3++; $htaccess_files .= displayFileError('red', 'Fichier .htaccess modifié à contrôler impérativement :', $file, $fgc); } continue; } } // Admin header('Proceed: '.__LINE__); if(preg_match('/\.\/'.$admin_dir.'\//', $file)) { if(preg_match('/filemanager/i', $file) && (version_compare(_PS_VERSION_, '1.6.0.0', '>='))) { continue; } if(preg_match('/(cleaner|ajax-upgradetab|adminer|pfm|sytem|htaccess|autoupgrade)/i', $file)) { continue; } $fgc = file_get_contents($file); if(!empty($md5_list->{$script_name}) && ($md5_list->{$script_name} != md5_file($file))) { $content = $fgc; if($filename == 'index.php') { $content = cleanIndex($content); if(empty($content)) { $admin_files .= displayFileError('#08db08', 'Fichier modifié par rapport à la version d\'origine. Contenu OK', str_replace('admin', '**admin**', $script_name), $fgc); } else { $found_admin++; $integrity = false; if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(preg_match('/(\/\*[0-9a-f]{5}\*\/|\\x[0-9a-f]{2,})/i', $content, $matches)) { $admin_files .= displayFileError('red', 'MD5 ADMIN INTEGRITY : Fichier index.php infecté ('.$matches[0].'). Contenu à restaurer impérativement', str_replace('admin', '**admin**', $script_name), $content); } else { $admin_files .= displayFileError('red', 'MD5 ADMIN WARNING : Fichier différent de l\'original', str_replace('admin', '**admin**', $script_name), $content); } } } else { $found_admin++; $integrity = false; if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } $admin_files .= displayFileError('orange', 'MD5 ADMIN WARNING : Fichier différent de l\'original', str_replace('admin', '**admin**', $script_name), $content); } continue; } if($md5_list && empty($md5_list->{$script_name})) { if($filename == 'index.php') { $content = cleanIndex($fgc); if(empty($content)) { $indexes .= displayFileError('#08db08', 'Fichier inexistant dans la version d\'origine. Contenu OK', str_replace('admin', '**admin**', $script_name), $fgc); } else { $found_admin++; if(preg_match('/(\/\*[0-9a-f]{5}\*\/|\.$O[4]\.|=urldecode|\\x[0-9a-f]{2,})/i', $content, $matches)) { $indexes .= displayFileError('red', 'MD5 INTEGRITY : Fichier index.php infecté ('.$matches[0].'). Contenu à contrôler impérativement', str_replace('admin', '**admin**', $script_name), $content); } else { $indexes .= displayFileError('red', 'Fichier inexistant dans la version d\'origine. Contenu à contrôler', str_replace('admin', '**admin**', $script_name), $content); } } } else { $found_admin++; $admin_files .= displayFileError('orange', 'Fichier inexistant dans la version d\'origine. Contenu à contrôler', str_replace('admin', '**admin**', $script_name), $fgc); } continue; } } // JS files header('Proceed: '.__LINE__); if(preg_match('/\.\/js\//', $file)) { if($path_parts == 'json') { continue; } if(!empty($md5_list->{$script_name})) { if($md5_list->{$script_name} != md5_file($file)) { $fgc = file_get_contents($file); $error_js++; if($zip_ok && is_file($file)) { $suspicious_zip->addFile($file, $script_name); } $scripts .= displayFileError('red', 'MD5 ADMIN WARNING : Fichier différent de l\'original', $file, $fgc); } continue; } if(preg_match('~[a-zA-Z0-9]{5,5}.js~', $filename) || preg_match('~[0-9]{3,30}~', $filename)) { $fgc = file_get_contents($file); $error_js++; if($zip_ok && is_file($file)) { $suspicious_zip->addFile($file, $script_name); } $fgc = file_get_contents($file); if(preg_match('/eval\(function\(/i', $fgc) || preg_match('~(:?\\\\x[0-9A-F]{2}){10}~mi', $fgc)) { $scripts .= 'Fichier JS infecté trouvé dans: '.$file.'
'; if($force) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(unlink($file)) { $scripts .= 'Fichier '.$script_name.' supprimé'.PHP_EOL; continue; } } } else { $message = $md5_list ? 'Fichier JS ajouté, inexistant dans la version d\'origine' : 'Fichier JS à contrôler'; $scripts .= displayFileError('red', $message, $file, $fgc); } } $filesize = filesize($file); if($filesize == 33637 || $filesize == 33082) { $error_js++; $scripts .= 'Fichier JS infecté trouvé dans: '.$script_name.'
'; if($force) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(unlink($file)) $scripts .= 'Fichier '.$script_name.' supprimé'.PHP_EOL; } continue; } } // Images header('Proceed: '.__LINE__); if(preg_match('/\.\/img\//', $file)) { if(stripos(file_get_contents($file), 'PHNjcmlwd') !== false) { $bad_image++; $images .= 'Fichier img infecté trouvé sur votre boutique: '.$file.'
'; if($force) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(unlink($file)) { $images .= 'Fichier '.$file.' supprimé'.PHP_EOL; } } } continue; } // Integrity header('Proceed: '.__LINE__); if($filename === 'defines.inc.php') { $fgc = file_get_contents($file); $lines = explode("\n", $fgc); foreach($lines as $key => $line) { if(preg_match("/include_once\((.*)'\);/i", $line, $matches)) { $bad_infected++; $bad_heuristic++; $integrity = false; $matches[1] = str_replace('$'.'_SERVER[\'DOCUMENT_ROOT\'].', '', $matches[1]); $infected = trim($matches[1], '/'); if(file_exists($infected)) { $infects .= 'Fichier indésirable détecté: ' . $infected .'
'; $integrity = false; if($force) { if($zip_ok) { $suspicious_zip->addFile($infected, str_replace('.', '', $infected)); } @unlink($infected); if(file_exists($infected)) { $infects .= 'Échec de la suppression de ce fichier - '.str_replace('.', '', $infected).' - contactez votre hébergeur pour le faire (le fichier est protégé contre la suppression)' .'
'; } else { $infects .= '>>> Supprimé: '.$infected.'
'; } } } if($force) { unset($lines[$key]); $lines = implode("\n", $lines); file_put_contents($file, $lines); $infects .= '>>> Corrigé: '.$script_name.'
'; } break 1; } } } if($filename === 'AdminLoginController.php') { $fgc = file_get_contents($file); if(preg_match('/base64/i', $fgc)) { $bad_infected++; $bad_heuristic++; if($force) { $fgc = preg_replace('/\$path(.*)PrestaShopLogger/ims', '/* Virus infection fixed already */ PrestaShopLogger', $fgc); $integrity = false; file_put_contents($file, $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } if(preg_match('/this->trans/i', $fgc) && preg_match('/displayError/i', $fgc) && !preg_match('/registerSession/i', $fgc)) { $bad_infected++; $bad_heuristic++; if($force) { $fgc = str_replace("if(!Tools::getValue('stay_logged_in'))", "if(method_exists(\$cookie, 'registerSession')) {\$cookie->registerSession(new EmployeeSession());}if(!Tools::getValue('stay_logged_in'))", $fgc); $integrity = false; file_put_contents($file, $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'Controller.php') { $fgc = file_get_contents($file); if(preg_match('/(.*)REQUEST_URI(.*)/', $fgc, $matches)) { $bad_infected++; $bad_heuristic++; $fgc = str_replace($matches[0], 'if (0) '.$matches[0], $fgc); $infects .= displayFileError('red', 'MD5 INTEGRITY >>>> Ligne modifiée: '.$matches[0], $file, $fgc); $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } if(preg_match('/=base64/i', $fgc) && !preg_match('/Virus infection fixed already/i', $fgc)) { $bad_infected++; $bad_heuristic++; $fgc = preg_replace('/\$html.=base64_decode/ims', '/* Virus infection fixed already */ // $html.=base64_decode', $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } if(preg_match('/base64/i', $fgc) && preg_match('/_hash/i', $fgc) && !preg_match('/Virus_infection_fixed_already/i', $fgc)) { $bad_infected++; $bad_heuristic++; $fgc = str_replace("_hash'", "_hash_commented_Virus_infection_fixed_already_" . uniqid() . "'", $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'FrontController.php') { $fgc = file_get_contents($file); if(preg_match('/=base64/i', $fgc) && !preg_match('/Virus infection fixed already/i', $fgc)) { $bad_infected++; $bad_heuristic++; $fgc = preg_replace('/\$html.=base64_decode/ims', '/* Virus infection fixed already */ // $html.=base64_decode', $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'Db.php') { $fgc = file_get_contents($file); if(preg_match('/base64/i', $fgc) && !preg_match('/Virus_infection_fixed_already/i', $fgc)) { $bad_infected++; $bad_heuristic++; $fgc = str_replace("_hash'", "_hash_commented_Virus_infection_fixed_already_" . uniqid() . "'", $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'Module.php') { $fgc = file_get_contents($file); $search = "-2) == '')"; $search_preg_match = "-2\) == ''\)"; $fix = "-2) == '?>')"; if(preg_match("/$search_preg_match/i", $fgc)) { $bad_infected++; $bad_heuristic++; $fgc = str_replace($search, $fix, $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } $search = 'encoding="UTF-8"'; $search_missing_preg_match = 'encoding="UTF-8" \?>'; $search_preg_match = 'encoding="UTF-8"'; $fix = 'encoding="UTF-8" ?>'; if(preg_match("/$search_preg_match/i", $fgc) && !preg_match("/$search_missing_preg_match/i", $fgc)) { $fgc = str_replace($search, $fix, $fgc); $bad_infected++; $bad_heuristic++; $infects .= '>>> Corrigé: '.$script_name.'
'; $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'alias.php') { $fgc = file_get_contents($file); if(preg_match('/(.*)md5(.*)/i', $fgc, $matches)) { $bad_infected++; $bad_heuristic++; $fgc = str_replace($matches[0], 'if (0) '.$matches[0], $fgc); $infects .= displayFileError('red', 'MD5 INTEGRITY >>>> Ligne modifiée: '.$matches[0], $file, $fgc); $integrity = false; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } if($filename === 'Mage.php') { $bad_infected++; $infects .= 'Fichier indésirable Mage.php détecté: '.$script_name.'
'; if($force) { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } @unlink($file); if(file_exists($file)) { $integrity = false; $infects .= '!!! Échec de la suppression de ce fichier - '.$script_name.' - contactez votre hébergeur pour le faire (le fichier est protégé contre la suppression)' .'
'; } else { $infects .= '>>> Fichier Mage.php supprimé' .'
'; } } continue; } if($filename === 'smarty_internal_templatebase.php') { $fgc = file_get_contents($file); $search = 'eval("" . $'; $search_preg_match = 'eval\(\"\" . \$'; $fix = '/* Virus infection fixed already */ eval("?>" . $'; if(preg_match("/$search_preg_match/i", $fgc)) { $bad_infected++; $bad_heuristic++; $integrity = false; $fgc = str_replace($search, $fix, $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } $search = "'/(<%|%>|<\?php|<\?|\)/'"; $search_preg_match = preg_quote("'/(<%|%>|<\?php|<\?|\)/'", '/'); $fix = "'/(<%|%>|<\?php|<\?|\?>)/'"; if(preg_match("/$search_preg_match/i", $fgc)) { $bad_infected++; $bad_heuristic++; $integrity = false; $fgc = str_replace($search, $fix, $fgc); $infects .= '>>> Corrigé: '.$script_name.'
'; if($force) { file_put_contents($file, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } continue; } // Files without extension header('Proceed: '.__LINE__); if(preg_match('/\.\/config\/|\.\/classes\/|\._/controllers\/|\.\/app\/|\.\/var\/|\.\/tools\//i', $file)) { if(!$path_parts) { $fgc = file_get_contents($file); if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } $integrity = false; $core_control .= displayFileError('orange', 'Fichier sans extension détecté', $script_name, $fgc); continue; } } // Smarty patch header('Proceed: '.__LINE__); if(preg_match('/config\/smarty\.config\.inc\.php/i', $file)) { $fgc = file_get_contents($file); if(preg_match('/if \(Configuration::get\(\'PS_SMARTY_CACHING_TYPE\'\)/', $fgc, $matches)) { $fgc = preg_replace('/if \(Configuration::get\(\'PS_SMARTY_CACHING_TYPE\'\)/', 'if(false && Configuration::get(\'PS_SMARTY_CACHING_TYPE\')', $fgc); if($force) { file_put_contents($file, $fgc); $core_control .= 'Fichier '.$script_name.' patché avec succès (Injection SQL possible par cache Smarty)
'; } } if(version_compare(_PS_VERSION_, '1.7.9.9', '<') && preg_match('~if\(false && Configuration::get~', $fgc)) { $core_control .= 'Contrôle du patch (Injection SQL possible par cache Smarty) sur '.$script_name.' => OK
'; } continue; } // Core control header('Proceed: '.__LINE__); if(($md5_list != false) && !preg_match('/\.\/modules\//', $file) ) { $error2 = 0; $original = true; $fgc = file_get_contents($file); if(!empty($md5_list->{$script_name}) && ($md5_list->{$script_name} != md5_file($file)) && ($path_parts == 'php') ) { if($filename == 'index.php') { $content = cleanIndex(file_get_contents($file)); if(empty($content)) { $core_control .= 'MD5 INTEGRITY : Fichier index.php modifié par rapport à la version d\'origine. Contenu OK: '.$script_name.'
'; } else { $original = false; $integrity = false; $error2++; if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(preg_match('/(\/\*[0-9a-f]{5}\*\/|\\x[0-9a-f]{2,})/i', $fgc, $matches)) $core_control .= displayFileError('red', 'MD5 INTEGRITY : Fichier index.php infecté ('.$matches[0].'). Contenu à restaurer impérativement', $script_name, $fgc); else $core_control .= displayFileError('red', 'MD5 INTEGRITY : Fichier index.php ('.$matches[0].') modifié par rapport à la version d\'origine. Contenu à contrôler', $script_name, $fgc); } continue; } else { $original = false; $integrity = false; $error2++; if(preg_match('/\$GLOBALS|\$_GET\[§\]|monarx|gzinflate\(substr\(/i', $fgc, $matches)) { if(preg_match('/'.$to_be_monitored.'/', $file)) { $bad_heuristic++; $core_control .= displayFileError('red', 'MD5 INTEGRITY : Fichier différent de l\'original et infecté ('.$matches[0].'). Contenu à restaurer impérativement', $script_name, $fgc); } else { $heuristic .= displayFileError('red', 'MD5 INTEGRITY : Fichier différent de l\'original et infecté ('.$matches[0].'). Contenu à restaurer impérativement', $script_name, $fgc); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } else { if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(preg_match('/'.$to_be_monitored.'/', $file)) { $bad_heuristic++; $heuristic .= displayFileError('orange', 'Contrôle de '.$filename.' : Fichier php modifié par rapport à la version d\'origine', $script_name, $fgc); } else { $core_control .= displayFileError('orange', 'MD5 INTEGRITY : Fichier php modifié par rapport à la version d\'origine. Contenu à contrôler', $root_directory.'/'.$script_name, $fgc); } } continue; } } if(($filename != $latest_filename) && !isset($md5_list->{$script_name}) && !preg_match('/modules\/|download\/|media\//', $file) && ($path_parts == 'php') ) { $copy = true; if($filename == 'index.php') { $content = cleanIndex($fgc); if(!empty($content)) { if(preg_match('/(\/\*[0-9a-f]{5}\*\/|monarx|\\x[0-9a-f]{2,}|\.$O[4]\.|=urldecode|cgi_bin|\.ico)/i', $content, $matches)) $indexes .= displayFileError('red', 'MD5 INTEGRITY : Fichier index.php infecté ('.$matches[0].'). Contenu à contrôler impérativement', $script_name, $content); else $indexes .= displayFileError('orange', 'MD5 INTEGRITY : Fichier index.php ajouté par rapport à la version d\'origine. Contenu à contrôler', $script_name, $content); } if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } continue; } $error2++; $color2 = '#187ed8'; if(preg_match('/config\//', $file) || preg_match('/parameters\.php/', $file)) { if($script_name == 'config/settings.inc.old.php') { unlink($file); continue; } $fgc = preg_replace('/(define\(\'.*?\', )([^)]*)(\);)/m', '$1XXXXXXX$3', $fgc); if($zip_ok) { $suspicious_zip->addFromString($script_name, $fgc); $copy = false; } } if(preg_match('#^(?:admin\/|js\/|img\/|cms\/|css\/|docs\/|pdf\/|themes\/|tmp\/|upload\/|media\/|download\/|localization\/)#i', dirname($script_name))) { $not_exist .= displayFileError('red', 'Fichier php suspect interdit dans ce répertoire', $script_name, $fgc); if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } $img_name = str_replace('.php', '', $file); if(unlink($file)) $not_exist .= 'Fichier '.$script_name.' indésirable supprimé
'; else $not_exist .= '!!! Échec de la suppression de ce fichier - '.$script_name.' - contactez votre hébergeur pour le faire (le fichier est protégé contre la suppression)' .'
'; $img_files = glob($img_name.'.*'); foreach($img_files as $img_file) { if($zip_ok) { $suspicious_zip->addFile($img_file, basename($img_file)); } $path_file = str_replace($root_path, '', $img_file); if(unlink($img_file)) $not_exist .= 'Fichier '.$path_file.' indésirable supprimé
'; else $not_exist .= '!!! Échec de la suppression de ce fichier - '.$path_file.' - contactez votre hébergeur pour le faire (le fichier est protégé contre la suppression)' .'
'; } continue; } else { if(preg_match('/move_uploaded_file|chr(101).chr(118).chr(97).chr(108).chr(40)|monarx|file_put_contents\s*\(|fwrite|uhex|decoct|bnexazabi|wp-admin|wp-includes|Licensse|60b638ef28394d9c17|\$ord\[[0-9]\]|0x5a455553|shaje3|gzuncompress|include\s*\(|"ক"|"খ"|"গ"|"ঘ"|$_POST\[|\.$O[4]\.|=urldecode|file_get_contents\s*\(|assert\s*\(|github\.io|dyuweyrj|dyuweyrj4|pastebin|eval\s*\(/iU', $fgc, $mmatches)) { $color2 = 'red'; $not_exist .= displayFileError($color2, 'Fichier php inexistant dans la version d\'origine qui contient des fonctions permettant une injection ('.$mmatches[0].')', $script_name, $fgc); } else { $color2 = 'orange'; $not_exist .= displayFileError($color2, 'Fichier php inexistant dans la version d\'origine. Contenu à contrôler', $script_name, $fgc); } } if($copy && $zip_ok) { $suspicious_zip->addFile($file, $script_name); } } if(!$original) { $content_file = $fgc; $origins = array(); $fgc = preg_replace_callback( $re, function($matches) use(&$origins) { static $n = 0; $n++; $i = "\4".$n."\4"; if($matches[0][0] == '\'') { $origins[$i] = $matches[0]; return $i; } if($matches[0][0] == '"') { $origins[$i] = $matches[0]; return $i; } return ''; } , $fgc ); if(preg_match_all($class_regex, $fgc, $matches)) { $test = $fgc; foreach($matches[0] as $match) { $test = str_replace($match, '', $test); } $test = trim(str_replace(array(''), '', $test)); $test = trim(preg_replace('~^\s*(?:use|namespace)\s+.*$~mxi', '', $test)); if(preg_match_all($function_regex, $test, $fmatches)) { foreach($fmatches[0] as $fmatch) { $test = str_replace($fmatch, '', $test); } $test = trim($test); } foreach($origins as $k => &$m) { $test = str_replace($k, $m, $test); } if(strlen($test)) { $error2++; $integrity = false; $core_control .= displayFileError('orange', 'Lignes hors classe', $script_name, $test); if(preg_match('/'.$to_be_monitored.'/', $file)) { $bad_heuristic++; $content_file = str_replace($test, '', $content_file); if($force) { file_put_contents($file, $content_file); $core_control .= 'Classe coeur corrigée: '.$script_name.'
'; } } } } } else { if(!$error2 && preg_match('/'.$to_be_monitored.'/', $file)) { $heuristic .= 'Contrôle de '.$filename.' => OK
'; } } } // Modules header('Proceed: '.__LINE__); if(preg_match('/\.\/modules\//', $file) && ($path_parts == 'php') ) { if(preg_match('/(soracaisse|paypal|kerawen|acaisse)/', $file)) { continue; } $original_content = $fgc = file_get_contents($file); if(preg_match('/httpd\.conf|monarx|sys_get_temp_dir\(\),|51la\.icw8\.com|\/a1\.txt|c3e34653504601739f7cbb3f79bb63d2|vhosts\.conf|fetchmailrc|shell_exec|0x5aa5| find_bl\(| f_id_daww| DateStripeV| hex2a\(| sanitas\(| smenu\(|hashcracking\.ru|rednoize\.com|trustisimportant|\.$O[4]\.|=urldecode|\.fun$|crackfor\.me/i', $fgc, $mmatches, PREG_OFFSET_CAPTURE) || preg_match('/ WSO| wso| f_id_daww/', $fgc, $mmatches, PREG_OFFSET_CAPTURE)) { $risk = $mmatches[0][0]; $bad++; if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } if(!unlink($file)) { $modules .= displayFileError('red', 'Fichier dangereux à supprimer impérativement (échec de la suppression):', $script_name, $original_content); } else { $modules .= displayFileError('red', 'Fichier dangereux supprimé ('.$risk.')', $script_name, $original_content); } continue; } if(preg_match('/netstat|move_uploaded_file|exploit-db|github\.io|0x5a455553|file_put_contents|GLOBALS|fwrite|include%28|base64_decode|gzinflate|str_rot13|include\(|file_get_contents\(|fwrite|assert\(|dyuweyrj|dyuweyrj4|pastebin|hex2bin%28|hex2bin\(|eval%28|eval\(/i', $fgc, $mmatches, PREG_OFFSET_CAPTURE)) { $risk = $mmatches[0][0]; $color_m = in_array($risk, array('eval%28','eval(','hex2bin%28','hex2bin(','str_rot13')) ? '#ff5900;' : 'orange;'; if(!$limited) { $origins = array(); $fgc = preg_replace_callback( $re, function ($matches) use (&$origins) { static $n = 0; $n++; $i = "\4".$n."\4"; if($matches[0][0] == '\'') { $origins[$i] = $matches[0]; return $i; } if($matches[0][0] == '"') { $origins[$i] = $matches[0]; return $i; } return ''; } , $fgc ); } if(!$limited && preg_match_all($class_regex, $fgc, $matches)) { $test = $fgc; foreach($matches[0] as $match) { $test = str_replace($match, '', $test); } $test = trim(str_replace(array(''), '', $test)); $test = trim(preg_replace('~^\s*(?:use|namespace)\s+.*$~mxi', '', $test)); if(preg_match_all($function_regex, $test, $fmatches)) { foreach($fmatches[0] as $fmatch) { $test = str_replace($fmatch, '', $test); } $test = trim($test); } foreach($origins as $k => &$m) { $test = str_replace($k, $m, $test); } if(preg_match('~'.preg_quote($risk,'~').'~', $test) && strlen($test)) { $bad++; $modules .= displayFileError($color_m, 'Fonction sensible hors classe à contrôler: '.$risk, $script_name, $fgc); if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } else { $bad++; $modules .= displayFileError($color_m, 'Fonction sensible à contrôler: '.$risk.'', $script_name, $fgc); if($zip_ok) { $suspicious_zip->addFile($file, $script_name); } } } } } } if($zip_ok) { $suspicious_zip->close(); } if(!file_exists($root_path.'img/.htaccess')) file_put_contents($root_path.'img/.htaccess', ''.PHP_EOL.'= 2.3>'.PHP_EOL.'Require all denied'.PHP_EOL.''.PHP_EOL.''.PHP_EOL.'Order deny,allow'.PHP_EOL.'Deny from all'.PHP_EOL.''.PHP_EOL.''); if(!file_exists($root_path.'localization/.htaccess')) file_put_contents($root_path.'localization/.htaccess', '= 2.3>'.PHP_EOL.'Require all denied'.PHP_EOL.''.PHP_EOL.''.PHP_EOL.'Order deny,allow'.PHP_EOL.'Deny from all'.PHP_EOL.''); if(!file_exists($root_path.'translations/.htaccess')) file_put_contents($root_path.'translations/.htaccess', '= 2.3>'.PHP_EOL.'Require all denied'.PHP_EOL.''.PHP_EOL.''.PHP_EOL.'Order deny,allow'.PHP_EOL.'Deny from all'.PHP_EOL.''); if(!file_exists($root_path.'themes/.htaccess')) file_put_contents($root_path.'themes/.htaccess', ''.PHP_EOL.'= 2.3>'.PHP_EOL.'Require all denied'.PHP_EOL.''.PHP_EOL.''.PHP_EOL.'Order deny,allow'.PHP_EOL.'Deny from all'.PHP_EOL.''.PHP_EOL.''); // Resume if(!$bad) { $modules .= 'Aucun code à risque trouvé
'; } if(!$bad1) { $dot_files .= 'Aucun fichier .xxx suspect trouvé
'; } if(!$bad2) { $htaccess_files .= 'Aucun fichier htaccess suspect trouvé
'; } else { $htaccess_files .= 'Veuillez contrôler l\'ajout de fichier php dans ces répertoires (Normalement détectés dans la recherche des modules)
'; if($bad3) { Tools::generateHtaccess(); $htaccess_files .= 'Veuillez contrôler le contenu de votre fichier .htaccess principal à la racine de votre site.
'; } } if(!$found_admin) { $admin_files .= 'Les fichiers de votre répertoire /admin sont conformes à la version d\'origine
'; } if(!$error_js) { $scripts .= 'Aucun fichier suspect JS detecté
'; } if(!$bad_image) { $images .= 'Aucun fichier image suspect detecté
'; if($limited) { $images .= 'Au vu des limitations de votre serveur l\'analyse des images produits n\'a pas été effectuée.
'; } } if(!$bad_infected) { $infects .= 'Aucun code suspect connu trouvé
'; } if(!$bad_found) { $bad_added_files .= 'Aucun fichier indésirable connu trouvé
'; } if(!$bad_heuristic) { $heuristic .= 'Aucun fichier sensible modifié
'; } if(!$bad_perms) { $files_perm .= 'Les droits en écriture sont ok sur les fichiers et répertoires
'; } $modules .= '
Peak usage: '.round(memory_get_peak_usage()/ 1024).' KB of memory.
'; $html .= $admin_files; $html .= $heuristic; $html .= $core_control; $html .= $scripts; $html .= $images; $html .= $infects; $html .= $bad_added_files; $html .= $files_perm; if(!$md5_list) { $html .= 'Votre version '.(version_compare(_PS_VERSION_, '1.6.1.26', '>') && version_compare(_PS_VERSION_, '8.0.0.0', '<') ? 'PhenixSuite' : 'Prestashop').' est inexistante dans les archives md5, le contrôle d\'intégrité n\'a donc pu être effectué.
'; } $html .= $dot_files; $html .= $htaccess_files; if($indexes) { $html .= '

Recherche des index.php ajoutés:

'.$indexes; } if($not_exist) { $html .= '

Recherche de fichiers php ajoutés:

'.$not_exist; } $html .= $modules; $html .= PHP_EOL; $html .= '

ANALYSE TERMINÉE (Effectuée en '.round(microtime(true) - $start_time, 3).' sec.)

'; if($integrity) { $html .= '
Intégrité '.(version_compare(_PS_VERSION_, '1.6.1.26', '>=') && version_compare(_PS_VERSION_, '1.7.0.0', '<') ? 'PhenixSuite' : 'Prestashop').' OK: Tous vos fichiers coeur sont conformes ou patchés '; } else { if($force) { if(version_compare(_PS_VERSION_, '1.7.0.0', '<=')) { $cache_folder_compile = $root_path.'cache/smarty/compile'; $cache_folder_cache = $root_path.'cache/smarty/cache'; if(file_exists($cache_folder_compile)) { recursiveDeleteDirAndFiles($cache_folder_compile); } /* Some hostings as OVH cloud crashes if(file_exists($cache_folder_cache)) { recursiveDeleteDirAndFiles($cache_folder_cache); }*/ } else { $cache_folder_dev = $root_path.'var/cache/dev'; $cache_folder_prod = $root_path.'var/cache/prod'; if(file_exists($cache_folder_dev)) { recursiveDeleteDirAndFiles($cache_folder_dev); } if(file_exists($cache_folder_prod)) { recursiveDeleteDirAndFiles($cache_folder_prod); } $cache_folder_dev = $root_path.'app/cache/dev'; $cache_folder_prod = $root_path.'app/cache/prod'; if(file_exists($cache_folder_dev)) { recursiveDeleteDirAndFiles($cache_folder_dev); } if(file_exists($cache_folder_prod)) { recursiveDeleteDirAndFiles($cache_folder_prod); } } if(file_exists($root_path.'cache/class_index.php')) { @unlink($root_path.'cache/class_index.php'); } if(file_exists($root_path.'cache/classes/index.php')) { @unlink($root_path.'cache/classes/index.php'); } $html .= '

Nettoyage du cache '.(version_compare(_PS_VERSION_, '1.6.1.26', '>') && version_compare(_PS_VERSION_, '1.7.0.0', '<') ? 'PhenixSuite' : 'Prestashop').' effectué
'; } if($md5_list) { $html .= '
!!! ATTENTION !!! Certains de vos fichiers coeurs ont été modifiés.
Si ces modifications ne sont pas volontaires, nous vous conseillons de comparer les fichiers avec les 2 zips (suspicious_xxxx et '.(version_compare(_PS_VERSION_, '1.6.1.26', '>=') && version_compare(_PS_VERSION_, '1.7.0.0', '<') ? 'PhenixSuite' : 'Prestashop').') et de les restaurer dans leur version d\'origine si nécessaire.


IMPORTANT: Si les fichiers coeurs modifiés commencent par /**/ vous avez été victime d\'un hack. Restaurez les versions d\'origine immédiatement !
'; } } $html .= PHP_EOL.PHP_EOL; if(version_compare(_PS_VERSION_, '1.6.1.27', '<=') || version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { // https://www.prestashop.com/download/old/prestashop_'._PS_VERSION_.'.zip $html .= ''.PHP_EOL.PHP_EOL; $html .= 'Si le lien ne fonctionne plus (Prestashop ayant modifié ses urls récemment) vous pouvez retrouver votre version ici: https://www.johanncorbel.fr/versions-de-prestashop/'.PHP_EOL.PHP_EOL; } if($zip_ok) { if(file_exists($zip_filename)) { $html .= ''.PHP_EOL.PHP_EOL; } if(!file_exists($daily_zip)) { copy($zip_filename, $daily_zip); } } if(version_compare(_PS_VERSION_, '1.6.0.0', '>=') && version_compare(_PS_VERSION_, '1.7.0.0', '<')) { $md5_filemanager = false; $api_url = 'https://devcustom.net/public/scripts/filemanager_md5.json'; $md5_file = file_get_contents($api_url, false, stream_context_create($arrContextOptions)); if($md5_file) { $md5_filemanager = json_decode($md5_file); } if(!is_object($md5_filemanager)) { $md5_filemanager = false; } $found = 0; $link = $root_directory.'/**admin**/filemanager'; $files1 = glob($root_path.$admin_dir .'/filemanager/*.php'); $files2 = glob($root_path.$admin_dir .'/filemanager/*/*.php'); $files = array_merge($files1, $files2); foreach($files as $file) { $script_name = str_replace($root_path.$admin_dir, 'admin', $file); if(basename($script_name) != 'index.php' && !empty($md5_filemanager->{$script_name}) && $md5_filemanager->{$script_name} != md5_file($file)) { $found++; $html .= '>>> FILEMANAGER WARNING <<< : Fichier non patché '.$link .'
'; break; } } if($found) { $html .= PHP_EOL.'Votre version possède une faille potentielle dans le répertoire '.$link.'. Veuillez télécharger la version patchée et la dézipper dans le répertoire de votre admin'.PHP_EOL.PHP_EOL; $html .= ''.PHP_EOL; $html .= 'ou'.PHP_EOL; $html .= '
'. PHP_EOL; } else { $html .= 'INFO: Votre site possède la version patchée du répertoire '.$link.'

'; } } if(version_compare(_PS_VERSION_, '1.7.0.0', '<') && version_compare(_PS_VERSION_, '1.6.1.27', '<')) { $html .= '

La dernière version PhenixSuite à jour compatible PHP8 pour votre version 1.6 est disponible !
'; $html .= '


'; } $html .= 'EoliaShop ©'; $message = preg_replace('~
(.*?)
~s', '', $html); $message = str_replace(' ', '', $message); $message .= '

Ce script a été exécuté aujourd\'hui à '.date('H:i:s').' depuis '.$current_url.'
IP de l\'apellant: '.getIpAddress().'
Si vous n\'êtes pas à l\'origine de cette action, veuillez contrôler vos accès FTP ou vérifier ceux qui en possèdent.
En cas de doute vous pouvez me contacter par mail à eolia@eoliashop.com

'; $message = str_replace('background:black;padding:15px 15px 30px;color:white;', 'max-width:1200px;width:100%;word-wrap: break-word;background:black;padding:15px 15px 30px;color:white;', $message); $to = '=?UTF-8?B?' . base64_encode($admin['firstname'].' '.$admin['lastname']).'?= <'.$admin['email'].'>'; $subject = '=?UTF-8?B?' . base64_encode('INFO: Une analyse de votre site '.$_SERVER['HTTP_HOST'].' a été lancée depuis le script @Eolia') .'?='; $headers[] = 'MIME-Version: 1.0'; $headers[] = 'Content-Type: text/html; charset=utf-8'; $headers[] = 'From: Security scan <'.$encoded.'@'.$_SERVER['HTTP_HOST'].'>'; $headers[] = 'Content-Transfer-Encoding: base64'; mail($to, $subject, base64_encode($message), implode("\r\n", $headers)); $html .= ''; if($escaped) { $html .= '

Fichiers de taille supérieure à 450Ko exclus de l\'analyse pour éviter le crash du script en défaut mémoire (segmentation fault):
'.$escaped.'
Si vous pensez que votre serveur peut les analyser, cliquez ci-dessous

'; } $html .= ' '; die($html); } function displayFileError($color, $message, $file, $content = false) { $script_name = str_replace('./', '', $file); return '
'.htmlspecialchars($message).' => '.htmlspecialchars($root_directory.'/'.$script_name). ($content ? '
'.htmlspecialchars($content).'
' : '').'
'; } function cleanIndex($content) { // Doekia $content = preg_replace('~/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/~m', '', $content); $content = preg_replace('~header\(.*\);~mU','',$content); $content = preg_replace('~<\?php~mU','',$content); $content = preg_replace('~exit+(|\(\));~mU','',$content); $content = preg_replace('~\?>~mU','',$content); $content = trim($content); return $content; } function getIpAddress() { $ipAddress = ''; if(!empty($_SERVER["HTTP_CF_CONNECTING_IP"])) { return $_SERVER["HTTP_CF_CONNECTING_IP"]; } if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ipAddress = $_SERVER['HTTP_CLIENT_IP']; } else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); foreach($ipAddressList as $ip) { if(!empty($ip)) { $ipAddress = $ip; break; } } } else if(!empty($_SERVER['HTTP_X_FORWARDED'])) { $ipAddress = $_SERVER['HTTP_X_FORWARDED']; } else if(!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) { $ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; } else if(!empty($_SERVER['HTTP_FORWARDED_FOR'])) { $ipAddress = $_SERVER['HTTP_FORWARDED_FOR']; } else if(!empty($_SERVER['HTTP_FORWARDED'])) { $ipAddress = $_SERVER['HTTP_FORWARDED']; } else if(!empty($_SERVER['REMOTE_ADDR'])) { $ipAddress = $_SERVER['REMOTE_ADDR']; } return $ipAddress; } function postmortem() { $resp = http_response_code(); if(in_array($resp,array(500,504))) { file_put_contents(__DIR__.'/cleaner500.log', print_r(array( date('c'), '$_SERVER' => $_SERVER, 'input' => file_get_contents('php://input'), error_get_last(), ), 1)); } } function cleanDirectory($dir) { $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach($files as $file) { if ($file->isDir()){ rmdir($file->getRealPath()); } else { unlink($file->getRealPath()); } } } function recursiveDeleteDirAndFiles($src, $all = true) { if($dir = opendir($src)) { while(false !== ($file = readdir($dir))) { if(($file != '.') && ($file != '..')) { if(is_dir($src.'/'.$file)) { recursiveDeleteDirAndFiles($src.'/'.$file); } else { unlink($src.'/'.$file); } } } closedir($dir); if($all) { rmdir($src); } } } function memoryTest() { $initial_memory = ini_get('memory_limit'); if(ini_set('memory_limit', '-1') === false) { $memory_limit = $initial_memory; } else { $memory_limit = '-1'; } $memory = array('memory_limit' => $memory_limit, 'display' => 'No limit'); if(preg_match('/^(\d+)(.)$/i', $memory_limit, $matches)) { if($matches[2] == 'T') { $memory_limit = $matches[1]*(1024 ** 4); } elseif($matches[2] == 'G') { $memory_limit = $matches[1]*(1024 ** 3); } elseif($matches[2] == 'M') { $memory_limit = $matches[1]*(1024 ** 2); } elseif($matches[2] == 'K') { $memory_limit = $matches[1]*1024; } $memory['memory_limit'] = $memory_limit; $memory['display'] = $matches[1].$matches[2]; } return $memory; } class DirFilter extends RecursiveFilterIterator { public function accept() { $excludes = array('cache', 'log', 'stats', 'error', 'import', 'export', 'ps_checkout','psaddonsconnect', 'bin', 'var', 'vendor', 'p'); return !(!$this->isDot() && $this->isDir() && in_array($this->getFilename(), $excludes)); } }